首页 > 解决方案 > 行绑定许多结构一致但列名不同的数据框

问题描述

我在 R 中有几个具有以下结构的数据框

> df1
 messy_col_name1  messy_group_name1
 numeric data     "group1"
 ...              ...
 numeric data     "group1"

> df2
 messy_col_name2  messy_group_name2
 numeric data     "group2"
 ...              ...
 numeric data     "group2"
 .
 .
 .
> dfN
 messy_col_nameN  messy_group_nameN
 numeric data     "groupN"
 ...              ...
 numeric data     "groupN"

所有这些数据框都有 2 列。第一列有实际值,第二列是组名(因子)的字符串。

我想知道是否有一种有效的方法可以逐行绑定这些数据帧,而无需重新标记每个数据帧上的列名。最终对象也应该是一个数据框。目的是使用aov()执行方差分析。最终结果应如下所示:

> df.combined
 col_name      group
 numeric_data  "group1"
 ...           ...
 numeric_data  "group1"
 numeric_data  "group2"
 ...           ...
 numeric_data  "group2"
 ...           ...
 numeric_data  "groupN"
 ...           ...
 numeric_data  "groupN"

我没有成功使用rbind()rbind.fill()bind_rows()等常用函数。

我检查了以下帖子,但是我无法解决此问题:

很多数据框,不同的行长,相似的列和数据框标题,如何绑定?

R:rbind 具有不同列名的数据帧

以下帖子很接近:

如何使用不同的列名来绑定不同的数据框?

但是,当有很多数据帧时,这篇文章中的解决方案效率不高。

标签: rmergebind

解决方案


按行绑定数据帧确实需要它们具有相同的列名。每个数据帧重新标记可能与任何其他解决方案一样有效。

我会列出数据框;这允许使用lapply重命名列。然后你可以使用do.call(rbind)or dplyr::bind_rows()

例如:

library(magrittr) # for the pipes
df.combined <- list(df1, df2, df3) %>% 
  lapply(., function(x) setNames(x, c("col_name", "group"))) %>% 
  do.call(rbind, .)

或使用dplyr

library(dplyr)
df.combined <- list(df1, df2, df3) %>% 
  lapply(., function(x) setNames(x, c("col_name", "group"))) %>% 
  bind_rows()

我敢打赌,使用包中的一个映射函数还有一个优雅的解决方案purrr


推荐阅读