在R中的两个数据帧中按组比较日期
我有一个数据框,其中按id包含事件日期:在R中的两个数据帧中按组比较日期,r,date,dataframe,compare,R,Date,Dataframe,Compare,我有一个数据框,其中按id包含事件日期: data.frame(id = c("a", "a", "a", "d", "d"), date = as.Date(c("2018-01-03", "2018-02-02", "2018-02-22", "2018-02-13", "2018-05-01"))) id date 1 a 2018-01-03 2 a 2018-02-02 3 a 2018-02-22 4 d 2018-02-13 5 d
data.frame(id = c("a", "a", "a", "d", "d"),
date = as.Date(c("2018-01-03", "2018-02-02", "2018-02-22", "2018-02-13", "2018-05-01")))
id date
1 a 2018-01-03
2 a 2018-02-02
3 a 2018-02-22
4 d 2018-02-13
5 d 2018-05-01
另一个包含周期开始和结束(按id):
data.frame(id = c("a", "a", "d", "d", "d", "d"),
start = as.Date(c("2018-01-15", "2018-01-30", "2018-03-01", "2018-02-01", "2018-04-02", "2018-03-19")),
end = as.Date(c("2018-01-18", "2018-02-10", "2018-03-03", "2018-04-22", "2018-05-23", "2018-08-29")))
id start end
1 a 2018-01-15 2018-01-18
2 a 2018-01-30 2018-02-10
3 d 2018-03-01 2018-03-03
4 d 2018-02-01 2018-04-22
5 d 2018-04-02 2018-05-23
6 d 2018-03-19 2018-08-29
对于每个id,我需要计算第一个数据帧中的每个日期所属的第二个数据帧的周期数
我想要的数据帧是:
id date n
1 a 2018-01-03 0 # does not belong to any period
2 a 2018-02-02 1 # belongs to [2018-01-30,2018-02-10]
3 a 2018-02-22 0 # does not belong to any period
4 d 2018-02-13 1 # belongs to [2018-02-01,2018-04-22]
5 d 2018-05-01 2 # belongs to [2018-04-02,2018-05-23] and [2018-03-19,2018-08-29]
我的问题不是比较数据和总结结果。我的问题是在每个id组中执行这些分析。我想有一种方法可以使用split
和/或apply
系列,但我没有找到方法
我怎样才能在R基地做到这一点?我在一个限制性的环境中工作,在那里我只能访问base R。base R方法
temp <- subset( merge(df1, df2), date >= start & date <= end, select = "date" )
df1$n <- sapply( df1$date, function(x) length( temp$date[ temp$date == x ] ))
# id date n
# 1 a 2018-01-03 0
# 2 a 2018-02-02 1
# 3 a 2018-02-22 0
# 4 d 2018-02-13 1
# 5 d 2018-05-01 2
temp=start&date另一种基本R方法:
dates <- data.frame(id = c("a", "a", "a", "d", "d"),
date = as.Date(c("2018-01-03", "2018-02-02", "2018-02-22", "2018-02-13", "2018-05-01")))
periods <- data.frame(id = c("a", "a", "d", "d", "d", "d"),
start = as.Date(c("2018-01-15", "2018-01-30", "2018-03-01", "2018-02-01", "2018-04-02", "2018-03-19")),
end = as.Date(c("2018-01-18", "2018-02-10", "2018-03-03", "2018-04-22", "2018-05-23", "2018-08-29")))
df <- transform(merge(dates, periods), belongs = date >= start & date <= end)
aggregate(belongs ~ date + id, data = df, sum)
# date id belongs
# 1 2018-01-03 a 0
# 2 2018-02-02 a 1
# 3 2018-02-22 a 0
# 4 2018-02-13 d 1
# 5 2018-05-01 d 2
非常感谢您给出这个简单而有效的答案!最后,虽然您的方法适用于我的示例,但它不适用于我的实际数据,但这是因为我的示例不够好。事实上,我的示例缺少一个案例,即来自df1
中两个不同的id
的两个相同的date
都属于df2
中的一个时段。通过使用df1[df1$date==“2018-02-13”,“date”]更改我的原始示例中的日期,可以获得这样的情况,非常感谢您提供了这个简单而有效的答案!
library(data.table)
dt <- as.data.table(merge(dates, periods))
dt[, .(n = sum(date >= start & date <= end)), by=c("id","date")]
# id date n
# 1: a 2018-01-03 0
# 2: a 2018-02-02 1
# 3: a 2018-02-22 0
# 4: d 2018-02-13 1
# 5: d 2018-05-01 2