【问题标题】:Aggregating columns by finding the difference between 2 dates in r通过查找 r 中 2 个日期之间的差异来聚合列
【发布时间】:2018-09-08 14:07:57
【问题描述】:

我需要使用聚合函数通过查找每个 ID 的最大(结束日期)和最小(开始日期)的差异来将下面的表 1 减少到表 2。我已经尝试了几个代码,但这是最新的;

Table2<-aggregate(table1$date,by=list(table1$ID),FUN=diff)
as.numeric(Table2)

   #Table1
       ID      Date
    1  100 1/10/1999
    2  100 1/10/1999
    3  100  4/7/2000
    4  100  4/8/2000
    5  100  3/7/2001
    6  110  3/8/2001
    7  110  4/8/2002
    8  110  4/6/2003
    9  110  4/7/2003
    10 110  3/6/2005

期望的结果

Table 2
ID  length(days)
100  788
110  1459

【问题讨论】:

  • 您应该添加一个可重复的数据集和您自己的代码。
  • 我尝试了几个 r 代码,但这是最新的 - Table2
  • 请将其添加到您的问题中。也可以使用dput 制作数据集
  • @Salman,我使用 dput 创建了数据的文本文件。我将它作为图像附加到我的问题中吗?我找不到附加文档选项

标签: r date aggregate


【解决方案1】:

请提供您自己的代码、数据和所需的输出,以获得对您最有用的答案...

下面是data.table 方法,它根据每个 ID 组的第一个和最后一个条目计算每个 ID 的持续时间。

library( data.table )

df <- data.frame( date = c(as.Date("2018-01-01"), as.Date("2018-02-04"), as.Date("2018-01-02"), as.Date("2018-02-04") ),
                  id = c(100,100,110,110),
                  stringsAsFactors = FALSE)

df
#         date  id
# 1 2018-01-01 100
# 2 2018-02-04 100
# 3 2018-01-02 110
# 4 2018-02-04 110

setDT(df)[, difftime( date[.N], date[1] ), by = id][]
#     id      V1
# 1: 100 34 days
# 2: 110 33 days

【讨论】:

  • 感谢您的代码,但是当我的日期和 ID 列包含 15,000 个数据点和每个 ID 10-15 个日期时,这可能很难应用
【解决方案2】:

Base R 和aggregate 可以轻松完成。
但首先将您的 Date 列强制转换为 Date 类。

table1$Date <- as.Date(table1$Date, "%m/%d/%Y")

aggregate(Date ~ ID, table1, function(x) x[length(x)] - x[1])
#   ID  Date
#1 100  787 
#2 110 1459

数据。

table1 <- read.table(text = "
ID      Date
1  100 1/10/1999
2  100 1/10/1999
3  100  4/7/2000
4  100  4/8/2000
5  100  3/7/2001
6  110  3/8/2001
7  110  4/8/2002
8  110  4/6/2003
9  110  4/7/2003
10 110  3/6/2005
", header = TRUE)

【讨论】:

    【解决方案3】:

    这是dplyr 的一种方法,假设您已经根据 Rui 的回答将 Date 转换为日期类型字段。

    library(dplyr)
    summary <- table1 %>%
      group_by(ID) %>%
      summarize(min = min(Date),
                max = max(Date)) %>%
      mutate(range = max - min + 1)
    
    summary
    # A tibble: 2 x 4
         ID min        max        range 
      <int> <date>     <date>     <time>
    1   100 1999-01-10 2001-03-07 788   
    2   110 2001-03-08 2005-03-06 1460  
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-29
      • 2016-03-20
      • 1970-01-01
      • 2014-08-07
      • 1970-01-01
      • 1970-01-01
      • 2010-09-22
      • 1970-01-01
      相关资源
      最近更新 更多