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

时间:2018-03-08 01:58:53

标签: r merge dataset subset merging-data

我想合并具有ID变量的6个数据集。我希望有一个数据集,其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

2 个答案:

答案 0 :(得分:0)

由于我们有6个数据集(假设对象是'df1','df2',...'df6'),请使用listmget中获取它们的值,然后将它们绑定在一起(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

base R选项是获取intersect

所有数据集中常见的'id'
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

答案 1 :(得分:0)

这是你在找什么?请参阅以下代码:

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