首页 > 解决方案 > 转换数据框列表:不是简单的 rbind,第二行到新列

问题描述

转换数据框列表:不是简单的 rbind,第二行到新列

我有一个清单

employeesList = list(data.frame(first = ("Al"), second = "Jones"), 
                 data.frame(first = c("Al", "Barb"), second = c("Jones",       "Smith")),
             data.frame(first = c("Al", "Barb", "Carol"), second =   c("Jones", "Smith", "Adams")),
             data.frame(first = ("Al"), second = "Jones"))

我正在寻找制作这个。

employeesDF = data.frame(first = c("Al", "Al", "Al", "Al"), second = c("Jones", "Jones", "Jones", "Jones"),
                        first2 = c(NA, "Barb", "Barb", NA), second2 = c(NA, "Smith", "Smith", NA),
                        first3 = c(NA, NA, "Carol", NA), second3 = c(NA, NA, "Adams", NA))

我希望每个数据框成为结果数据框中的一行。请注意,转换后的第一个数据帧将有两列,转换后的第二个 df 将有四列,转换后的第三个 df 将产生 6 列,转换后的第四个 df 将产生 2 列,依此类推。我意识到必须填写 NA 值我已经做了一些研究,如果目标只是 rbind,问题就解决了。我看不到解决我的问题的方法。 将数据帧列表转换为一个数据帧

阅读本文后, 当 我开始使用不同的列集时,按行组合两个数据帧(rbind)

res1 = cbind(t(employeesList[[1]][1]), t(employeesList[[1]][2]))
res2 = cbind(t(employeesList[[2]][1]), t(employeesList[[2]][2]))
res3 = cbind(t(employeesList[[3]][1]), t(employeesList[[3]][2]))
res4 = cbind(t(employeesList[[4]][1]), t(employeesList[[4]][2]))

然后

library(dplyr)
bind_rows(list(res1, res2, res3, res4))

但是我可能有大量的数据帧—— res1, ..., resn。列数未预先指定,但可能会少于 10。我的程序没有命名列,我认为 bind_rows 需要这样做。

标签: rdplyrbindrows

解决方案


我们可以使用lapply并将列表转换为单行数据框,然后使用bind_rows将多个数据框绑定在一起。

library(dplyr)
bind_rows(lapply(employeesList, function(x) rbind.data.frame(c(t(x)))))

#   X.Al. X.Jones. X.Barb. X.Smith. X.Carol. X.Adams.
#1    Al    Jones    <NA>     <NA>     <NA>     <NA>
#2    Al    Jones    Barb    Smith     <NA>     <NA>
#3    Al    Jones    Barb    Smith    Carol    Adams
#4    Al    Jones    <NA>     <NA>     <NA>     <NA>

setNames我们可以稍后根据自己的喜好重命名列。


推荐阅读