2016-07-21 14 views
0
data <- read.table(text= 
"ID1 ID2 From To 
12 127 20090701 20090703 
12 127 20090704 20090711 
12 127 20090707 20100831 
12 127 20100901 99991231 
18 880 19740401 20091129 
18 880 20100608 99991231 
12 127 20080102 20080305 
12 127 20080306 20080329 
12 128 20080620 20090204" 
, header=T) 

Ich mag den oben Datenrahmen in das folgende Formular verwandeln:Wie aggregiert Zeiträume gruppiert nach Identifikatoren?

result <- read.table(text= 
"ID1 ID2 From To 
12 127 20080102 20080329 
12 127 20090701 99991231 
12 128 20080620 20090204 
18 880 19740401 20091129 
18 880 20100608 99991231" 
, header=T) 

Die tranformation in wenigen Worten zu einer Gruppe von ID1, ID2 und dem einzigartigen Zeitraum, in dem das Subjekt ständig aktiv war (nicht ein einziger Tag Pause). Das bedeutet, dass die mehreren Zeilen in Fällen fallen, in denen sie nicht benötigt werden (eine durchgehende Aktivitätsperiode von Datum 1 bis Datum 2).

Auf die Lösung wird hingewiesen.

Für den Anfang konvertieren die Termine:

df$From <- as.Date(as.character(df$From), format = "%Y%m%d") 
df$To <- as.Date(as.character(df$To), format = "%Y%m%d") 
+0

Zunächst sollten Sie die Spalte 'Von' und' To' wie folgt umwandeln: 'df $ From <- as.Date (as.character (df $ Von), format ="% Y% m% d ")' Damit können Sie prüfen, ob zwei Tage aufeinanderfolgende Tage sind. – Marcel10

+0

definitiv, Zeichenfolge muss in Daten umgewandelt werden, danke für das Hinzeigen. Ich dachte über eine dplyr Lösung wie df%>% group_by (ID1, ID2)%>% muate (Funktion1, um das Datum von ab zu bekommen)%>% muate (Funktion2, um das Datum zu erhalten) ... wo die Funktionen sein könnten a für i loop oder etwas ähnliches ich denke –

+0

Klingt wie ein vernünftiger Ansatz. Viel Glück! – Marcel10

Antwort

1

Figured ein Weg, dies wie folgt zu tun:

library(dplyr) 
data$From <- as.Date(as.character(data$From), format = "%Y%m%d") 
data$To <- as.Date(as.character(data$To), format = "%Y%m%d") 
data <- data %>% arrange(ID2, From) %>% mutate(Difference=9999) 
marker <- 1 
for (i in 2:length(data$ID1)){ 
    if(data$ID2[i]!=data$ID2[i-1]) marker=i 
    else{ 
    data$Difference[i]=difftime(data$From[i], data$To[marker]) 
    if(data$Difference[i]>1) marker=i 
    else if(data$To[i]>data$To[marker]) data$To[marker]=data$To[i] 
    } 
} 
data <- filter(data, Difference>1) 
data <- data[,-which(colnames(data)=="Difference")] 

Kann jemand andere Lösung bieten als für i-Schleife?