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")
答案 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循环吗?