如何通过变量的公共值合并数据集

How to merge datasets by common values for variable

我想合并 6 个具有 ID 变量的数据集。我想要一个数据集,其 ID 值对所有数据集都是通用的。

我知道这很容易修复,但我还没有遇到帮助主题

例如

id month sbp dpb
D1  3     40  40 
D1  4     10  10
D1  3     20  20
D2  4     30  20
D3  5     10  40
D1  3     40  40

id month sbp dpb
D1  3     40  40 
D1  4     10  10
D2  3     20  20
D4  4     30  20
D3  5     10  40
D1  3     40  40

决赛

id month sbp dpb
D1  3     40  40 
D1  4     10  10
D1  3     20  20
D2  4     30  20
D3  5     10  40
D1  3     40  40
D1  3     40  40 
D1  4     10  10
D2  3     20  20
D3  5     10  40
D1  3     40  40

最终数据集中省略了 D4

因为我们有 6 个数据集(假设对象是 'df1'、'df2'、... 'df6'),在 list 中获取它们的值使用 mget,然后将它们绑定在一起 (bind_rows) 并 filter 去掉所有不常见的 'id'

library(dplyr)
n <- 2 #Based on the example only two objects, change it to 6
mget(paste0("df", seq_len(n))) %>%
          bind_rows(., .id = 'grp') %>% 
          group_by(id) %>% 
          filter(n_distinct(grp)==n) %>%
          ungroup %>%
          select(-grp)
# A tibble: 11 x 4
#   id    month   sbp   dpb
#   <chr> <int> <int> <int>
# 1 D1        3    40    40
# 2 D1        4    10    10
# 3 D1        3    20    20
# 4 D2        4    30    20
# 5 D3        5    10    40
# 6 D1        3    40    40
# 7 D1        3    40    40
# 8 D1        4    10    10
# 9 D2        3    20    20
#10 D3        5    10    40
#11 D1        3    40    40

A base R 选项是获取所有数据集中常见的“id” intersect

lst <- setNames(mget(paste0("df", seq_len(n))), NULL)
ids <- Reduce(intersect, lapply(lst, `[[`, 'id'))    
res <- do.call(rbind, lapply(lst, subset, subset = id %in% ids))
row.names(res) <- NULL
res
#   id month sbp dpb
#1  D1     3  40  40
#2  D1     4  10  10
#3  D1     3  20  20
#4  D2     4  30  20
#5  D3     5  10  40
#6  D1     3  40  40
#7  D1     3  40  40
#8  D1     4  10  10
#9  D2     3  20  20
#10 D3     5  10  40
#11 D1     3  40  40

这就是您要找的吗?请参阅下面的代码:

df3 <- subset(df2, df2$id %in% df1$id)      
df <- rbind(df2, df3)