【发布时间】:2020-05-21 18:58:39
【问题描述】:
如果这个问题很简单,我很抱歉,但我一直在网上搜索,似乎找不到简单的解决方案。
我目前有一个 R 对象列表(命名向量或 1 个变量的数据框,我可以使用其中任何一个),我想将它们加入 1 个大型数据框,每个唯一名称/行名有 1 行,1 列对于原始列表中的每个元素。
我的起始列表如下所示:
l1 <- list(df1 = data.frame(c(1,2,3), row.names = c("A", "B", "C")),
df2 = data.frame(c(2,6), row.names = c("B", "D")),
df3 = data.frame(c(3,6,9), row.names = c("C", "D", "A")),
df4 = data.frame(c(4,12), row.names = c("A", "E")))
我希望输出看起来像:
data.frame("df1" = c(1,2,3,NA,NA),
+ "df2" = c(NA,2,NA,6,NA),
+ "df3" = c(9,NA,3,6,NA),
+ "df4" = c(4,NA,NA,NA,12), row.names = c("A", "B", "C", "D", "E"))
df1 df2 df3 df4
A 1 NA 9 4
B 2 2 NA NA
C 3 NA 3 NA
D NA 6 6 NA
E NA NA NA 12
我不介意填充值是 NA 还是 0(最终我想要 0,但这很容易解决)。
我几乎肯定plyr::cbind.fill 确实做到了这一点,但我一直在我的脚本的其余部分使用 dplyr,我认为两者都不是一个好主意。 dplyr::bind_cols 似乎不适用于不同长度的向量。我知道这里有人问过一个非常相似的问题:R: Is there a good replacement for plyr::rbind.fill in dplyr?
但正如我所提到的,这个解决方案实际上似乎不起作用。 dplyr::full_join 也没有,甚至包裹在 do.call 中。是否有直接的解决方案,或者是编写自定义函数的唯一解决方案?
【问题讨论】:
-
不确定您是否注意到,但由于您在
data.frame中放置了一个没有名称的向量,因此您的名称很乱,例如c.1..2..3. -
@camille 我确实注意到,在我的实际数据中并非如此。列表元素一开始只是命名向量,但我可以轻松地将它们强制转换为 1 个变量的数据框,并且列名最终与相应的列表元素名称相同。