从多个数据框中子集公共行

Subset common rows from multiple data frames

我有多个数据框,如下所述,每行都有唯一的 ID。我正在尝试查找公共行并创建一个至少出现在两个数据框中的新数据框。

Id=2 的示例行出现在所有三个数据框中。类似地,Id= 3 的行存在于 df1 和 df3 中。

我想做一个循环,它可以找到公共行并创建一个具有公共行的新数据框。

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 是唯一的。 另外,我想从重复的原始数据框中删除行,我正在使用它来创建新的数据框。

合并所有数据框:

combined <- rbind(df1, df2, df3)

提取重复项:

duplicate_rows <- unique(combined[duplicated(combined), ])

(duplicated(combined) 给你重复行的行索引)

I have multiple dataframes like mentioned below with unique id for each row. I am trying to find common rows and make a new dataframe which is appearing at least in two dataframes.

由于没有 ID 在同一个 table 中出现两次,我们可以将 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