如何基于许多标准合并许多数据集

问题描述

我有一个主要数据集,还有三年中的其他3个数据集(2015年为data2015,2016年为data2016,2017年为data2017)

maindata<-data.frame(ID=rep(1:3,3),Year=c(rep("2015",rep("2016",rep("2017",3)),Age=c(20,32,40,33,12,43,25,27,18))
data2015<-data.frame(ID=1:5,value=c(10,20,30,50))
data2016<-data.frame(ID=1:4,50))
data2017<-data.frame(ID=c(1,2,3,5),70))

我正在寻找将最后3个数据集合并到主数据集中的最短方法,以便在下面拥有这样的数据集:

   ID  Year value    Age
1  1   2015    10    20
2  2   2015    20    32
3  3   2015    30    40
4  1   2016    10    33
5  2   2016    20    12
6  3   2016    40    43
7  1   2017    10    25
8  2   2017    30    27
9  3   2017    40    18

解决方法

library(tidyverse)

df = list(data2015,data2016,data2017) %>% 
  set_names(2015:2017) %>% 
  bind_rows(.id = "Year")

maindata %>%   
  left_join(df,by = c("ID","Year"))
# ID Year Age value
# 1 2015  20    10
# 2 2015  32    20
# 3 2015  40    30
# 1 2016  33    10
# 2 2016  12    20
# 3 2016  43    40
# 1 2017  25    10
# 2 2017  27    30
# 3 2017  18    40
,

从预期的输出中,您似乎想向maindata添加新列

library(dplyr)
library(purrr)

bind_cols(maindata,map_df(mget(ls(pattern = 'data\\d+')),~
       filter(.x,ID %in% unique(maindata$ID))) %>%
       select(-ID))

#  ID Year value
#1  1 2015    10
#2  2 2015    20
#3  3 2015    30
#4  1 2016    10
#5  2 2016    20
#6  3 2016    40
#7  1 2017    10
#8  2 2017    30
#9  3 2017    40

在基数R中,可以通过以下方式完成:

cbind(maindata,do.call(rbind,lapply(mget(ls(pattern = 'data\\d+')),function(x) 
                        subset(x,ID %in% unique(maindata$ID))))[-1])
,

另一个基本的R选项

datalist <- mget(ls(pattern = "data\\d+"))
merge(maindata,do.call(
    rbind,Map(function(x,v) within(x,Year <- v),datalist,gsub("\\D","",names(datalist)))
  ),"Year")
)

给出

  ID Year Age value
1  1 2015  20    10
2  1 2016  33    10
3  1 2017  25    10
4  2 2015  32    20
5  2 2016  12    20
6  2 2017  27    30
7  3 2015  40    30
8  3 2016  43    40
9  3 2017  18    40