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

时间:2015-10-03 01:11:49

标签: r

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

data.frame 1

1 id300
2 id2345
3 id5456
4 id33
5 id45
6 id54

data.frame2

1 id832
2 id300
3 id1000
4 id45
5 id984
6 id5456
7 id888

所以我希望我的输出是:

1 id300
2 id45
3 id5456

有什么建议吗?

6 个答案:

答案 0 :(得分:14)

此处相应的dplyr函数为inner_join(返回df x中df y匹配的所有行。)

library(dplyr)
inner_join(df1, df2)

      V1
1  id300
2 id5456
3   id45

注意:行按df1中的顺序返回。如果您inner_join(df2, df1) id45id5456将会出现在z = np.array([[[0, 0, 0], [10, 10, 10]], [[0, 0, 0], [5, 5, 5]], [[0, 0, 0], [2, 2, 2]]]) print(z.mean(axis=2).mean(axis=1)) >[ 5. 2.5 1. ] 之前。

答案 1 :(得分:10)

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

答案 2 :(得分:5)

使用merge

new_data_frame <- merge(data.frame1, data.frame2)

我假设每个数据框中只有一列,并且它们在两个帧中都具有相同的名称。如果不使用要与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

如您所见,它们不共享列名,每个列有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

剩下的唯一行是在所选列中具有相同条目的那些行。

答案 3 :(得分:3)

我们也可以在将fintersect转换为data.table

之后,使用data.frame中的data.table执行此操作
library(data.table)
fintersect(setDT(df1), setDT(df2))
#       v1
#1:  id300
#2:   id45
#3: id5456

数据

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"))

答案 4 :(得分:0)

要实现这一点,您应该在两个数据框中分配行名,然后在R中使用intersect进行处理。这可以使用以下命令来实现:

intersect(dataframe.1$V1,dataframe.2$V2)

答案 5 :(得分:0)

使用dplyr包的intersect函数

  1. 安装这个包

  2. 像这样使用这个函数

    var_name <- intersect(第一个数据集的名称,第二个数据集的名称)

关于这个最好的事情是它也可以与字符一起使用,而合并和内连接不能给出结果 您也可以使用此功能查看它们在数据集上的位置

for (i in (no. of duplicates ) ) {
 for (j in ( no. of rows in other dataset  ) ) {
  if (new[i] == ac$variable_name[j]) {
  print(j)
  }
  } 
}