繁体   English   中英

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

[英]How to find common rows between two dataframe in R?

我想创建一个新的数据框,它只包含两个单独的 data.frame 的公共行。 例子:

数据框 1

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

数据框2

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

所以我希望我的输出是:

1 id300
2 id45
3 id5456

请问有什么建议吗?

此处适当的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)id45会在id5456之前。

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

使用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

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

我们也可以做到这一点fintersectdata.table转换后data.framedata.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"))

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

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

使用 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)
  }
  } 
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM