比较两个文件并输出公共元素

时间:2014-06-16 17:21:33

标签: r

我有2个3列和数百行的文件。我想比较并列出两个文件的前两列的常见元素。然后我将在比较后得到的列表我必须将第二个文件的第三列添加到该列表。第三列将包含第二个文件中的值,这些值对应于剩余的两列的数量,这些列对于两个文件都是共同的。 例如,考虑两个6行3列的文件 第一个文件 -

1 2   3
2 3   4
4 6   7
3 8   9
11 10 5
19 6  14

第二档 -

1 4   1
2 1   4
4 6   10
3 7   2
11 10 3
19 6  5

正如我所说,我必须比较前两列,然后将第二列文件的第三列添加到该列表中。因此,输出必须是:

  4  6  10
  11 10 3
  19  6 5

我有以下代码,但是它显示的错误对象未找到,我也无法添加第三列。请帮忙 :) df2 =读取第一个文件,df3 =读取第二个文件。代码是R语言。

s1 = 1
for(i in 1:nrow(df2)){
 for(j in 1:nrow(df3)){
     if(df2[i,1] == df3[j,1]){
        if(df2[i,2] == df3[j,2]){
             common.rows1[s1,1] <- df2[i,1]
             common.rows1[s1,2] <- df2[i,2]
             s1 = s1 + 1
         }
     }
 }

4 个答案:

答案 0 :(得分:1)

您可以使用%in%运算符两次对第二个data.frame进行子集化(我称之为df2):

df2[df2$V1 %in% df1$V1 & df2$V2 %in% df1$V2,]

#  V1 V2 V3
#3  4  6 10
#5 11 10  3
#6 19  6  5
我的示例中的

V1V2df1df2的列名。

答案 1 :(得分:1)

这似乎是merge的完美用例,例如

merge(d1[c('V1','V2')],d2)

结果:

  V1 V2 V3
1 11 10  3
2 19  6  5
3  4  6 10

其中&#39; V1&#39;和&#39; V2&#39;是感兴趣的列名。

答案 2 :(得分:1)

data.table提案

library(data.table)
setDT(df1)
setDT(df2)
setkey(df1, V1, V2)
setkey(df2, V1, V2)

df2[df1[, -3, with = F], nomatch = 0]

##    V1 V2 V3
## 1:  4  6 10
## 2: 11 10  3
## 3: 19  6  5

答案 3 :(得分:0)

如果您的两个表格为d1d2

d1<-data.frame(
    V1 = c(1, 2, 4, 3, 11, 19),
    V2 = c(2, 3, 6, 8, 10, 6), 
    V3 = c(3, 4, 7, 9, 5, 14)
)

d2<-data.frame(
    V1 = c(1, 2, 4, 3, 11, 19), 
    V2 = c(4, 1, 6, 7, 10, 6),
    V3 = c(1, 4, 10, 2, 3, 5)
)

然后您可以使用

d2(为了保留第三列)进行分组
d2[interaction(d2$V1, d2$V2) %in% interaction(d1$V1, d1$V2),]

interaction()将前两列视为组合键。