我有多个数据框,如下所述,每一行都有唯一的ID。我正在尝试查找常见的行并创建一个新的数据框,该框至少出现在两个数据框中。
在所有三个数据框中都出现了id = 2的example-行。类似地,在df1和df3中有Id = 3的行。
我想做一个循环,该循环可以找到常见的行,并用常见的行创建一个新的数据框。
df1 <- data.frame(Id=c(1,2,3,4),a=c(0,1,0,2),b=c(1,0,1,0),c=c(0,0,4,0))
df2 <- data.frame(Id=c(7,2,5,9),a=c(4,1,9,2),b=c(1,0,1,5),c=c(3,0,7,0))
df3 <- data.frame(Id=c(5,3,2,6),a=c(9,0,1,5),b=c(1,1,0,0),c=c(7,4,0,0))
> df1 > df2
Id | a | b | c | Id | a | b | c |
---|---|---|---| ---|---|---|---|
1 | 0 | 1 | 0 | 7 | 4 | 1 | 3 |
---|---|---|---| ---|---|---|---|
2 | 1 | 0 | 0 | 2 | 1 | 0 | 0 |
---|---|---|---| ---|---|---|---|
3 | 0 | 1 | 4 | 5 | 9 | 1 | 7 |
---|---|---|---| ---|---|---|---|
4 | 2 | 0 | 0 | 9 | 2 | 5 | 0 |
> df3
Id | a | b | c |
---|---|---|---|
5 | 9 | 1 | 7 |
---|---|---|---|
3 | 0 | 1 | 4 |
---|---|---|---|
2 | 1 | 0 | 0 |
---|---|---|---|
6 | 5 | 0 | 0 |
> expected_output
Id | a | b | c |
---|---|---|---|
5 | 9 | 1 | 7 |
---|---|---|---|
3 | 0 | 1 | 4 |
---|---|---|---|
2 | 1 | 0 | 0 |
---|---|---|---|
注意:-ID是唯一的。
另外,我想从原始数据框中删除重复的行,并用它来创建新的数据框。
最佳答案
由于没有一个ID在同一张表中出现两次,因此我们可以将这些ID制成表格并保留找到的两次:
library(data.table)
DTs = lapply(list(df1,df2,df3), data.table)
Id_keep = rbindlist(lapply(DTs, `[`, j = "Id"))[, .N, by=Id][N >= 2L, Id]
DT_keep = Reduce(funion, DTs)[Id %in% Id_keep]
# Id a b c
# 1: 2 1 0 0
# 2: 3 0 1 4
# 3: 5 9 1 7
您的数据应以
DTs
之类的对象开头,而不是一堆单独的命名对象。这个怎么运作
为了了解它是如何工作的,请检查诸如
list(df1,df2,df3)
lapply(DTs, `[`, j = "Id")
Reduce(funion, DTs)
另外,阅读帮助文件,例如
?lapply
,?rbindlist
和?funion
。关于r - 子集来自多个数据帧的公共(public)行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45380839/