假设我有这个数据框A:
A = data.frame(first=c("a", "b","c", "d"), second=c(1, 2, 3, 4))
first second
1 a 1
2 b 2
3 c 3
4 d 4
我有这个数据框B:
B = data.frame(first=c("x", "a", "c"), second=c(1, 4, 3))
first second
1 x 1
2 a 4
3 c 3
我想计算一对数据帧B(B $ first,B $ second)在数据帧A中的次数。计数部分不是问题,我只是找不到函数确定一对是否在数据框中。
结果是只有c(“c”,3)是A的元素,所以它应该是1.“a”和4都在数据帧A中,但是c(“a”, 4)数据框A中不存在,所以我不想算这个。我想要完全匹配。
我正在寻找像%in%这样的功能,可以用于配对。
感谢您的帮助
答案 0 :(得分:3)
也许是这样的
apply(B, 1, function(r, A){ sum(A$first==r[1] & A$second==r[2]) }, A)
基本上,它的作用如下:对于B
的每一行,它应用一个函数来检查A
的哪些元素与r
中的行B
一致}(部分A$first==r[1] & A$second==r[2]
)然后对获得的逻辑求和,以得出A
中与行r
一致的行数。
如果您还想进行分组,可以使用dplyr
像这样轻松完成
cbind(B,tmp) %.% group_by(first,second) %.% summarise(n=max(tmp))
其中tmp
是表示上述apply
答案 1 :(得分:3)
以下是另一种选择:rbind
您的data.frame
一起使用duplicated
。
AB <- do.call(rbind, mget(c("A", "B")))
AB$ind <- as.numeric(duplicated(AB))
AB[grep("^B", rownames(AB)), ]
# first second ind
# B.1 x 1 0
# B.2 a 4 0
# B.3 c 3 1
您也可以尝试使用“摘要”为每一行生成一个哈希值,但我不确定这会有多高效:
library(digest)
Reduce(function(x, y) y %in% x,
lapply(mget(c("A", "B")), function(x)
apply(x, 1, digest)))
# [1] FALSE FALSE TRUE
答案 2 :(得分:1)
另一种方法是按行合并,例如mB<-apply(B,1,function(j) paste0(j[1],"_",j[2])
和A
类似,您可以循环mB[j]%in%mA[k]
不是我真的建议这样做: - )