【问题标题】:how can you cbind elements from a list with unequal lengths?如何从长度不等的列表中 cbind 元素?
【发布时间】:2020-10-18 08:17:03
【问题描述】:

如果我有一个列表 x 包含 3 个元素,即 data.frames abc,我该如何运行函数 FUNC,它需要像 FUN(x$a, x$b, x$c) 这样的三个数据帧?

示例数据

my.list <- list(data.frame(y1 = c(1, 2)),
                data.frame(y2 = c(3, 2, 1)),
                data.frame(y3 = c(7, 8, 4,5,6)))
names(my.list) <- c("a", "b", "c")

我遇到的主要问题是my.list 有时可能有元素abc,有时还有e 和/或f,所以我想要一种方法来调用这些元素不依赖于元素的名称或元素的数量。

我一直在努力

 do.call(cbind, my.list)

但我收到错误消息

data.frame(..., check.names = FALSE) 中的错误: 参数意味着不同的行数:2、3、5

【问题讨论】:

  • 那么你想cbind每个列表元素的第一列吗?
  • 为了这个例子,是的。
  • 像这样:do.call(cbind, my.list)?
  • 好的,是的!感谢这个例子的出色工作。我的真实数据的问题在于,该函数 id 是一个自定义函数,它基本上通过用NA 填充间隙来对长度不等的向量执行cbind。你能解决这个问题,我会相应地更改示例吗?

标签: r list


【解决方案1】:

如果每个数据帧中的行数不相等,则首先需要使它们具有相同的长度,然后cbind

n <- max(sapply(my.list, nrow))
out <- do.call(cbind, lapply(my.list, function(x) x[1:n, , drop = FALSE]))
rownames(out) <- NULL
out

#  y1 y2 y3
#1  1  3  7
#2  2  2  8
#3 NA  1  4
#4 NA NA  5
#5 NA NA  6

【讨论】:

    【解决方案2】:

    我们可以从rowr使用cbind.fill

    library(rowr)
    do.call(cbind.fill, c(my.list, fill = NA))
    

    【讨论】:

      猜你喜欢
      • 2015-12-29
      • 2022-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多