选择数据帧的行号以另一个数据帧为条件

时间:2014-01-10 01:16:47

标签: r dataframe

我有一个数据框,我想找到这些行与另一个数据框共有的行号。

要明确问题,请说我有数据框A和数据框B:

dfA <- data.frame(NAME = rep(c("a", "b"), each = 3),
                  TRIAL = rep(1:3, 2),
                  DATA = runif(6))
dfB <- data.frame(NAME = c("a", "b"), 
                  TRIAL = c(2, 3))
dfA
#   NAME TRIAL       DATA
# 1    a     1 0.62948592
# 2    a     2 0.88041819
# 3    a     3 0.02479411
# 4    b     1 0.48031827
# 5    b     2 0.86591315
# 6    b     3 0.93448264
dfB
#   NAME TRIAL
# 1    a     2
# 2    b     3

我想获得dfA的行号,其中dfA和dfB具有相同的NAME和TRIAL,在这种情况下,行号为2和6。

我尝试了下面的代码,给了我第2,3,5,6行。它分别匹配NAME和TRIAL,不起作用。

which(dfA$NAME %in% dfB$NAME & dfA$TRIAL %in% dfB$TRIAL)
# 2 3 5 6

然后我尝试创建一个虚拟列并匹配此col。工作,但如果dfB有很多列,代码将是详细的...

dfA$dummy <- paste0(dfA$NAME, dfA$TRIAL)
dfB$dummy <- paste0(dfB$NAME, dfB$TRIAL)
which(dfA$dummy %in% dfB$dummy)
# 2 6

我想知道是否有更好的方法来解决问题,谢谢你的帮助!

2 个答案:

答案 0 :(得分:4)

你可以这样做:

merge(transform(dfA, row.num = 1:nrow(dfA)), dfB)$row.num
# [1] 2 6

如果找到索引的整个目标是您可以对dfA进行分组,那么您可以merge(dfA, dfB)

答案 1 :(得分:0)

或使用重复:

apply(dfB, 1, function(x)
  which(duplicated(rbind(x, dfA[1:2])))-1)
# [1] 2 6