2016-07-21 3 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) 

Iは、以下の形式に上記データフレームを変換したい:識別子をグループ化して期間を集計する方法は?

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) 

いくつかの単語で形質転換のはID1、ID2及び対象が(連続的にアクティブでなかったユニークな時間によってグループにあります1日の休憩)。それは不要な場合に複数の行を削除します(日付1から日付2までの1つの連続した活動期間)。

解決策を指摘します。手始めに

、日付を変換:

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

まず、 'From'と' To'カラムを次のように変換する必要があります: 'df $ From < - as.Date(as.character(df $ From)、format ="%Y%m%d ")これにより、2日間が連続しているかどうかを確認することができます。 – Marcel10

+0

間違いなく、文字列を日付に変換する必要があります。私はdf%>%group_by(ID1、ID2)%>%mutate(日付から取得するfunction1)%>%mutate(function2は日付を取得する)のようなdplyrソリューションを考えていました。私のループや何か似たようなものだと思います。 –

+0

賢明なアプローチのようですね。がんばろう! – Marcel10

答えて

1

は、次のようにこれを行うための一つの方法を考え出し:

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")] 

誰も私のforループ以外のソリューションを提供することができますか?

関連する問題