子集来自多个数据帧的公共行

时间:2017-07-28 19:13:07

标签: r dataframe data.table dplyr tidyr

我有多个数据帧,如下所述,每行都有唯一的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是唯一的。 此外,我想从原始数据帧中删除重复的行,我正在使用它来创建新的数据帧。

2 个答案:

答案 0 :(得分:2)

  

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

由于同一个表中没有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

您的数据应该以{{1​​}}之类的对象开头,而不是一堆单独的命名对象。

工作原理

要了解它的工作原理,请检查中间对象,例如

  • DTs
  • list(df1,df2,df3)
  • lapply(DTs, `[`, j = "Id")

另外,请阅读帮助文件,例如Reduce(funion, DTs)?lapply?rbindlist

答案 1 :(得分:1)

合并所有数据框:

combined <- rbind(df1, df2, df3)

提取重复项:

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

duplicated(combined)为您提供重复行的行索引)