如何解决如何基于许多标准合并许多数据集
我有一个主要数据集,还有三年中的其他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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。