我有一个数据框,我想找到这些行与另一个数据框共有的行号。
要明确问题,请说我有数据框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
我想知道是否有更好的方法来解决问题,谢谢你的帮助!
答案 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