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