提取每个主题(R)中另一个数据框中存在的日期

时间:2019-03-26 10:24:37

标签: r date dataframe

我有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中是否还有其他计算效率更高的方法可以执行此操作?谢谢!

4 个答案:

答案 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