【问题标题】:Merging multiple pairs of data-frame in R在R中合并多对数据框
【发布时间】:2022-01-11 18:58:04
【问题描述】:

我希望合并多对数据框。例如,我有以下两组数据框 Con_2014、Con_2015、Con_2016 和收入_2014、收入_2015、收入_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="")))}

它运行,但它只给我每对的名称。它的合并字符串(文件名但不是数据)

【问题讨论】:

  • 您能否使用dput 提供一组最小的数据框?
  • 看看get()函数。它允许您通过字符名称来调用变量。顺便说一句,您不必将as.character() 用于整数。 R默认转成字符。
  • 这可能对你有帮助:stackoverflow.com/questions/8091303/…
  • @Albin,不,这没有多大帮助。如果我是对的,他们会将多个文件合并到一个文件中,在我的情况下,我想合并两个文件,然后合并另外两个文件并继续处理其他文件对。所以这里会有多个输出合并文件,在这种情况下,只有一个输出合并文件。
  • 结合Albin的优秀链接,见How to make a list of data frames。将所有数据框放在list 中将使您想做的任何操作都变得更加容易。例如,如果您有一个con 列表和一个income 列表,您将使用con_income = mapply(merge, con, income) 来获取结果列表。

标签: r dataframe merge


【解决方案1】:

*观察。我相信最后一个对象应该是 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

【讨论】:

    【解决方案2】:

    这不是最漂亮的东西,但它确实有效:

    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="")))))
    }
    
    

    【讨论】:

      猜你喜欢
      • 2012-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-04
      • 2023-03-06
      相关资源
      最近更新 更多