如何在R中的两个数据帧之间找到公共行?

zar*_*ara 14 r

我想创建一个新的数据框,其中只包含两个独立的data.frame的公共行.例:

data.frame 1

1 id300
2 id2345
3 id5456
4 id33
5 id45
6 id54
Run Code Online (Sandbox Code Playgroud)

data.frame2

1 id832
2 id300
3 id1000
4 id45
5 id984
6 id5456
7 id888
Run Code Online (Sandbox Code Playgroud)

所以我希望我的输出是:

1 id300
2 id45
3 id5456
Run Code Online (Sandbox Code Playgroud)

有什么建议吗?

Joe*_*Joe 19

这里适当的dplyr函数是inner_join(返回df x中df匹配的所有行y.)

library(dplyr)
inner_join(df1, df2)

      V1
1  id300
2 id5456
3   id45
Run Code Online (Sandbox Code Playgroud)

注意:行按它们所在的顺序返回df1.如果你这样做inner_join(df2, df1),id45就会来id5456.

  • 是的,我认为你会使用“anti_join(df1, df2)”。查看函数文档了解具体信息。 (2认同)

Nav*_*swi 14

common <- intersect(data.frame1$col, data.frame2$col)  
data.frame1[common,] # give you common rows in data frame 1  
data.frame2[common,] # give you common rows in data frame 2
Run Code Online (Sandbox Code Playgroud)

  • 我认为这个答案并没有正确回答这个问题.它甚至没有推广到包含两列或更多列的data.frames. (4认同)

R. *_*ini 6

使用 merge

new_data_frame <- merge(data.frame1, data.frame2)
Run Code Online (Sandbox Code Playgroud)

我假设每个数据帧中只有一列,并且在两个帧中它们具有相同的名称。如果不使用您想与by.x = "nameCol1"和相交的列by.y = "nameCol2",其中nameCol是实际的列名。

在第一个注释之后添加
如果您在任何数据框中有更多列,则命令相同。这样做:

>a  #Data frame 1
      c1 c2
1  id300  6
2 id2345  5
3 id5456  4
4   id33  3
5   id45  2
6   id54  1

> b #Data frame 2
     a  f
1  asd 12
2 id33 10
3 id45  8
4 id54  6
Run Code Online (Sandbox Code Playgroud)

如您所见,它们不共享列名,每个都有2列。所以:

> merge(a,b, by.x = "c1", by.y = "a")

    c1 c2  f
1 id33  3 10
2 id45  2  8
3 id54  1  6
Run Code Online (Sandbox Code Playgroud)

剩下的唯一行是在选定列中具有相同公共条目的行。


akr*_*run 6

我们也可以在将to转换后使用fintersectfrom来执行此操作data.tabledata.framedata.table

library(data.table)
fintersect(setDT(df1), setDT(df2))
#       v1
#1:  id300
#2:   id45
#3: id5456
Run Code Online (Sandbox Code Playgroud)

数据

df1 <- structure(list(v1 = c("id300", "id2345", "id5456", "id33", "id45", 
"id54")), .Names = "v1", class = "data.frame", row.names = c("1", 
"2", "3", "4", "5", "6"))

df2 <- structure(list(v1 = c("id832", "id300", "id1000", "id45", "id984", 
"id5456", "id888")), .Names = "v1", class = "data.frame", row.names = c("1", 
"2", "3", "4", "5", "6", "7"))
Run Code Online (Sandbox Code Playgroud)