如何汇总由识别人员分组的时间段?

时间:2016-07-21 12:53:15

标签: r date aggregation

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)

我想将上述数据框转换为以下形式:

 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到日期2的一个连续活动期)。

赞赏解决方案。

首先,转换日期:

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

1 个答案:

答案 0 :(得分: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")]

任何人都可以提供其他解决方案而不是i循环吗?