[英]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
剩下的唯一行是那些在所选列中具有相同条目的行。
我们也可以做到这一点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"))
为此,您应该在两个数据框中分配行名称,然后在 R 中使用 intersect 进行处理。 这可以使用以下命令来实现:
intersect(dataframe.1$V1,dataframe.2$V2)
使用 dplyr 包的 intersect 函数
安装这个包
像这样使用这个功能
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.