我有2个数据框,两个数据框的日期不同:
数据框1
ID Date
A 21/1/2018
A 22/1/2018
B 21/1/2018
B 26/2/2018
C 19/9/2019
数据框2
ID Date
A 21/1/2018
A 22/1/2018
A 23/1/2018
B 21/1/2018
B 22/1/2018
B 23/1/2018
C 20/1/2018
C 04/5/2018
我只想从数据框2中提取数据框1中每个参与者中存在的日期。
ID Date
A 21/1/2018
A 22/1/2018
B 21/1/2018
或某种行索引:
[1 2 4]
我可能可以使用嵌套循环来完成此操作,但是我的数据包含成千上万的情况,所以想知道R中是否还有其他计算效率更高的方法可以执行此操作?谢谢!
答案 0 :(得分:2)
如果您有两个日期向量:
dates1 <- seq(as.Date('1999/01/01'), as.Date('1999/01/10'), by="day")
dates2 <- seq(as.Date('1999/01/08'), as.Date('1999/01/15'), by="day")
然后您可以找到所需日期的索引
which(dates2 %in% dates1)
答案 1 :(得分:1)
如果我正确理解了您的问题,似乎merge(df2, df1)
应该可以正常工作。
merge(df2, df1)
ID Date
1 A 21/1/2018
2 A 22/1/2018
3 B 21/1/2018
答案 2 :(得分:0)
您可以进行以下过滤:
df2[df2$Date %in% df1$Date, ]
答案 3 :(得分:0)
如果我对您的理解正确,那么您想从两个数据框中找出在同一dates
中存在的ID
。我们可以split
基于ID
的两个数据帧,并在Date
中找出df2
中的df1
,然后提取这些行。
do.call(rbind, Map(function(x, y) x[x$Date %in% y$Date, ],
split(df2, df2$ID), split(df1, df1$ID)))
# ID Date
#A.1 A 21/1/2018
#A.2 A 22/1/2018
#B B 21/1/2018
您还可以通过执行操作获取行索引
df2$row <- 1:nrow(df2)
unname(unlist(Map(function(x, y) x$row[x$Date %in% y$Date],
split(df2, df2$ID), split(df1, df1$ID))))
#[1] 1 2 4