我很抱歉这个问题很简单,但是我一直在搜寻互联网,但似乎找不到简单的解决方案。
我目前有一个R对象的列表(命名矢量或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是个好主意。 dplyr::bind_cols
似乎不适用于不同长度的向量。我知道有人在这里问过一个非常类似的问题:R: Is there a good replacement for plyr::rbind.fill in dplyr?但是正如我提到的那样,该解决方案实际上似乎不起作用。即使包裹在dplyr::full_join
中,do.call
也没有。是否有一个简单的解决方案,还是编写自定义函数的唯一解决方案?
我们可以将行名转换为具有rownames_to_column
的列,然后将rename
转换为第二列,将list
元素与bind_rows
绑定,并使用pivot_wider
整形为'wide']
library(dplyr)
library(tidyr)
library(purrr)
library(tibble)
map(l1, ~ rownames_to_column(.x, 'rn') %>%
rename_at(2, ~'v1')) %>%
bind_rows(.id = 'grp') %>%
pivot_wider(names_from = grp, values_from = v1) %>%
column_to_rownames('rn')