通过查找r中2个日期之间的差来汇总列

时间:2018-09-08 14:07:57

标签: r date aggregate

我需要使用合计函数通过找到每个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

3 个答案:

答案 0 :(得分:0)

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

下面是一种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

答案 1 :(得分:0)

基于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)

答案 2 :(得分:0)

这里是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