r - 按行名合并不均匀数据帧列表

标签 r

我在一个列表中有几个数据框,我想将它们合并到一个大数据框中。实际列表包含数千个此数据帧,因此我正在寻找一个更有效的解决方案。

列表看起来类似于:

v <- data.frame(answer = c(1,1,1))
rownames(v) <- c("A","B","C")
w <- data.frame(answer = c(1,0,0))
rownames(w) <- c("A","B","D")
x <- data.frame(answer = c(1,1,1))
rownames(x) <- c("A","B","C")
y <- data.frame(answer = c(0,0,0))
rownames(y) <- c("A","C","D")
z <- data.frame(answer = c(0,0,0,1))
rownames(z) <- c("A","B","C","D")
l <- list(v,w,x,y,z)
names(l) <- c("V","W","X","Y","Z")

最终输出应该是这样的:

    v    W    X    Y    Z
A   1    1    1    0    0
B   1    0    1    NA   0
C   1    NA   1    0    0
D   NA   0    NA   0    1

我已经尝试过的方法(如果您已经有了可行的解决方案,请忽略这部分)

  df <- data.frame(matrix(unlist(l), nrow=length(l), byrow=T),stringsAsFactors=FALSE)

df <- do.call(rbind.data.frame, l)

df<- rbindlist(l) (from library("data.frame"))

那些都丢失了行名中包含的信息,并且只有在所有数据帧具有相同长度和相同顺序时才似乎有效。

唯一对我的实际数据有用的是:

df<- suppressWarnings(Reduce(function(dtf1, dtf2) merge(dtf1, dtf2, by = 
"answer", all = TRUE),l))

但我无法让它与我的示例列表一起使用,即使它可以工作,它也非常低效,并且一旦列表变长就需要很长时间。

最佳答案

这是一个使用 mergeReduce 的基础 R 解决方案:

df <- Reduce(
    function(x, y) merge(x, y, by = "id", all = T),
    lapply(l, function(x) { x$id <- rownames(x); x }))
colnames(df) <- c("id", names(l))
#  id  V  W  X  Y Z
#1  A  1  1  1  0 0
#2  B  1  0  1 NA 0
#3  C  1 NA  1  0 0
#4  D NA  0 NA  0 1

关于r - 按行名合并不均匀数据帧列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49728645/

相关文章:

r - 在 R 中使用向量代替 for 循环

R - 用 apply 系列中的函数替换双循环

r - R 中的优化

r - R 中的成对误差估计产生错误的乘积

减少一些繁琐的代码以求简单

r - 为什么R会把数字1000变成整数999?

r - knitr 代码块选项隐藏 roxygen 注释

r - 在 shinydashboard 中获取最近点击的下拉菜单的 notificationItem

r - R 中的嵌套 Logit 或 Probit

r - 在 R 函数中创建变量常量