2014-05-02 38 views
3

比方说,我有这样的数据帧答:如何测试一对元素是否在数据框中?

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 $第一,B $秒)在数据帧A中。计数部分不是问题,我只是找不到函数来确定一对是否在数据帧中。结果将是只有c(“c”,3)是A的一个元素,所以它应该是1.“a”和4都在数据帧A中,但是对偶c(“a” ,4)在数据框A中不存在,所以我不想数这个。我想要完全匹配。

我正在寻找一个像%这样的功能,可以用于配对。

感谢您的帮助

回答

3

也许这样的事情

apply(B, 1, function(r, A){ sum(A$first==r[1] & A$second==r[2]) }, A) 

基本上,它的作用是:为B每一行应用于一个函数,检查其中的A元素按照从BA$first==r[1] & A$second==r[2]部分)开始,使用行r,然后将获得的逻辑相加以得出A中符合行r的行数。

如果你也想分组它可以很容易地dplyr做过这样的

cbind(B,tmp) %.% group_by(first,second) %.% summarise(n=max(tmp)) 

其中tmp是代表上述apply

+0

错误。现在编辑它:( – iugrina

+0

^^即将发表评论我想检查B元素是否在A中(不是A元素在B中,小细节),但更具体地说,我不希望这对(“a”,4 )被计数,到目前为止你的答案是计算它 –

+0

看起来它正在做这项工作,你能给它更多的细节,因此我将其标记为答案?我的意思是我会标记它;) –

1

另一种结果的变量是由行合并,例如mB<-apply(B,1,function(j) paste0(j[1],"_",j[2]),同样为A,此时可以循环mB[j]%in%mA[k]

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

+0

我已经想到这一点;如果你没有注意力(如果你明白我的意思),是不是会有问题? –

+0

@T_O我认为它可以通过'j'和'k'的双循环工作......但正如我所说的,其他答案看起来更合理。 –

+0

我的观点是如果A包含具有元素(“a”,“ab”)的行并且B包含具有元素(“aa”,“b”)的行,那将是一团混乱 –

3

这里有一个选择:rbinddata.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 
+0

您的第一个解决方案实际上在计算时间方面非常高效 –

+0

@T_O,我的个人选择这些将是我的第一个解决方案。只是分享替代品,就是这样:-) – A5C1D2H2I1M1N2O1R2T1

相关问题