如何测试一对元素是否在数据框中?

时间:2014-05-02 11:00:04

标签: r

假设我有这个数据框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%这样的功能,可以用于配对。

感谢您的帮助

3 个答案:

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

不是我真的建议这样做: - )