在 R 中合并多对数据帧
Merging multiple pairs of data-frame in R
我想合并多对数据框。例如,我有以下两组数据框 Con_2014、Con_2015、Con_2016
和 Income_2014、Income_2015、Income_2016。所以我想像下面这样一次合并每年的数据。
Con_Income_2014 <- merge(Income_2014,Con_2014)
Con_Income_2015 <- merge(Income_2015,Con_2015)
Con_Income_2016 <- merge(Income_2016,Con_2016)`
下面的方法我试过了,还是不行。
for (i in 1: length(years)){
assign(paste("Con_Income", as.character(years[i]),sep =""),merge(paste("Income_",as.character(years[i]),sep=""),paste("Cons_",as.character(years[i]),sep="")))}
它运行但它只给我每对的名称。它合并字符串(文件名而不是数据)
这不是最漂亮的东西,但它确实有效:
Income_2014 = data.frame(id = 1:5, x = runif(5,-1,1))
Income_2015 = data.frame(id = 6:10, x = runif(5,-1,1))
Income_2016 = data.frame(id = 11:15, x = runif(5,-1,1))
Cons_2014 = data.frame(id = 1:5, y = runif(5,2,3))
Cons_2015 = data.frame(id = 6:10, y = runif(5,2,3))
Cons_2016 = data.frame(id = 11:15, y = runif(5,2,3))
years <- 2014:2016
for (i in 1: length(years)){
assign(paste("Cons_Income", as.character(years[i]),sep =""),
merge(eval(parse(text=paste("Income_",as.character(years[i]),sep=""))),
eval(parse(text=paste("Cons_",as.character(years[i]),sep="")))))
}
*观察。我认为最后一个对象应该是 con_... 而不是 cons_...(打字错误)
我们不需要 for 循环。
如果所有年份都与一对数据框相关联,并且命名一致,我们可以使用 mget(ls(pattern = ....))
创建两个数据框列表,然后使用 mapply
:
进行成对合并
mapply(merge,
mget(ls(pattern = "Income_20\d{2}")),
mget(ls(pattern = "Con_20\d{2}")),
SIMPLIFY = FALSE) %>%
setNames(paste0('income_con_', 2014:2016))
@DaveArmstrong 创建的数据:
set.seed(1)
Income_2014 = data.frame(id = 1:5, x = runif(5,-1,1))
Income_2015 = data.frame(id = 6:10, x = runif(5,-1,1))
Income_2016 = data.frame(id = 11:15, x = runif(5,-1,1))
Cons_2014 = data.frame(id = 1:5, y = runif(5,2,3))
Cons_2015 = data.frame(id = 6:10, y = runif(5,2,3))
Cons_2016 = data.frame(id = 11:15, y = runif(5,2,3))
输出:
$income_con_2014
id x y
1 1 -0.4689827 2.497699
2 2 -0.2557522 2.717619
3 3 0.1457067 2.991906
4 4 0.8164156 2.380035
5 5 -0.5966361 2.777445
$income_con_2015
id x y
1 6 0.7967794 2.934705
2 7 0.8893505 2.212143
3 8 0.3215956 2.651674
4 9 0.2582281 2.125555
5 10 -0.8764275 2.267221
$income_con_2016
id x y
1 11 -0.5880509 2.386114
2 12 -0.6468865 2.013390
3 13 0.3740457 2.382388
4 14 -0.2317926 2.869691
5 15 0.5396828 2.340349
我想合并多对数据框。例如,我有以下两组数据框 Con_2014、Con_2015、Con_2016 和 Income_2014、Income_2015、Income_2016。所以我想像下面这样一次合并每年的数据。
Con_Income_2014 <- merge(Income_2014,Con_2014)
Con_Income_2015 <- merge(Income_2015,Con_2015)
Con_Income_2016 <- merge(Income_2016,Con_2016)`
下面的方法我试过了,还是不行。
for (i in 1: length(years)){
assign(paste("Con_Income", as.character(years[i]),sep =""),merge(paste("Income_",as.character(years[i]),sep=""),paste("Cons_",as.character(years[i]),sep="")))}
它运行但它只给我每对的名称。它合并字符串(文件名而不是数据)
这不是最漂亮的东西,但它确实有效:
Income_2014 = data.frame(id = 1:5, x = runif(5,-1,1))
Income_2015 = data.frame(id = 6:10, x = runif(5,-1,1))
Income_2016 = data.frame(id = 11:15, x = runif(5,-1,1))
Cons_2014 = data.frame(id = 1:5, y = runif(5,2,3))
Cons_2015 = data.frame(id = 6:10, y = runif(5,2,3))
Cons_2016 = data.frame(id = 11:15, y = runif(5,2,3))
years <- 2014:2016
for (i in 1: length(years)){
assign(paste("Cons_Income", as.character(years[i]),sep =""),
merge(eval(parse(text=paste("Income_",as.character(years[i]),sep=""))),
eval(parse(text=paste("Cons_",as.character(years[i]),sep="")))))
}
*观察。我认为最后一个对象应该是 con_... 而不是 cons_...(打字错误)
我们不需要 for 循环。
如果所有年份都与一对数据框相关联,并且命名一致,我们可以使用 mget(ls(pattern = ....))
创建两个数据框列表,然后使用 mapply
:
mapply(merge,
mget(ls(pattern = "Income_20\d{2}")),
mget(ls(pattern = "Con_20\d{2}")),
SIMPLIFY = FALSE) %>%
setNames(paste0('income_con_', 2014:2016))
@DaveArmstrong 创建的数据:
set.seed(1)
Income_2014 = data.frame(id = 1:5, x = runif(5,-1,1))
Income_2015 = data.frame(id = 6:10, x = runif(5,-1,1))
Income_2016 = data.frame(id = 11:15, x = runif(5,-1,1))
Cons_2014 = data.frame(id = 1:5, y = runif(5,2,3))
Cons_2015 = data.frame(id = 6:10, y = runif(5,2,3))
Cons_2016 = data.frame(id = 11:15, y = runif(5,2,3))
输出:
$income_con_2014
id x y
1 1 -0.4689827 2.497699
2 2 -0.2557522 2.717619
3 3 0.1457067 2.991906
4 4 0.8164156 2.380035
5 5 -0.5966361 2.777445
$income_con_2015
id x y
1 6 0.7967794 2.934705
2 7 0.8893505 2.212143
3 8 0.3215956 2.651674
4 9 0.2582281 2.125555
5 10 -0.8764275 2.267221
$income_con_2016
id x y
1 11 -0.5880509 2.386114
2 12 -0.6468865 2.013390
3 13 0.3740457 2.382388
4 14 -0.2317926 2.869691
5 15 0.5396828 2.340349