替换dplyr中的plyr :: cbind.fill?

问题描述 投票:1回答:1

我很抱歉这个问题很简单,但是我一直在搜寻互联网,但似乎找不到简单的解决方案。

我目前有一个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也没有。是否有一个简单的解决方案,还是编写自定义函数的唯一解决方案?

r dplyr plyr cbind
1个回答
1
投票

我们可以将行名转换为具有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')
© www.soinside.com 2019 - 2024. All rights reserved.