【问题标题】:How to aggregate time periods grouped by identificators?如何聚合按标识符分组的时间段?
【发布时间】:2016-11-25 01:56:40
【问题描述】:
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")

【问题讨论】:

  • 首先,您应该将FromTo 列转换为:df$From &lt;- as.Date(as.character(df$From), format = "%Y%m%d") 这使您可以检查两天是否连续。
  • 当然,字符串需要转换为日期,thanx 指出这一点。我正在考虑一个 dplyr 解决方案,例如 df %>% group_by(ID1, ID2) %>% mutate(function1 to get the from date) %>% mutate(function2 to get the to date)...函数可能在哪里我猜一个 for i 循环或类似的东西
  • 听起来是一种明智的做法。祝你好运!
  • 99992131 的日期是什么?
  • 抱歉,它应该是 99991231(已编辑),表示 9999 年 12 月 31 日。它是一个遥远的未来,以表示无限的生命周期

标签: r date aggregation


【解决方案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 i 循环之外的其他解决方案吗?

【讨论】:

    猜你喜欢
    • 2012-02-09
    • 2017-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多