【问题标题】:naming and rbinding all elements (dfs, matrices, vectors, etc.) from lists of list命名和绑定列表列表中的所有元素(dfs、矩阵、向量等)
【发布时间】:2016-08-02 15:09:12
【问题描述】:

我有一个这样的列表:

# output from a package function
A <- list(a = matrix(1:9,ncol=3),
          b = matrix(1:8,ncol=4),
          c = 1.5)

B <- list(a = matrix(11:19,ncol=3),
          b = matrix(11:18,ncol=4),
          c = 2.5)

# list with all outputs (from loaded=lapply(filenames, function(x) get(load(x))) )
superlist <- list(A, B))

我想做的是首先将每个列表项(A,B)的名称添加到所有二阶列表元素中。例如 B 会变成:

B <- list(a = cbind(matrix(11:19,ncol=3),c("B","B","B")),
           b = cbind(matrix(11:18,ncol=4),c("B","B")),
           c = c(2.5,"B"))

然后,目标是将所有具有相同名称的矩阵、值或数据帧 (a,b,c) 绑定在一起,这样我就可以:

superlist <- list(a = rbind(cbind(matrix(1:9,ncol=3),c("A","A","A")),cbind(matrix(11:19,ncol=3),c("B","B","B"))),
           b = rbind(cbind(matrix(1:8,ncol=4),c("A","A")),cbind(matrix(11:18,ncol=4),c("B","B"))),
           c = rbind(c(1.5,"A"),c(2.5,"B")))

对于 rbinding,我得到的最好的是这个(来自rbind all dataframes in a list of lists by name):

do.call("rbind",lapply(superlist ,function(x) x[["a"]]))

但是,它只针对一个列表元素(我有超过 20 个)。我知道我可以写一个循环,但是因为我会经常使用这个函数,所以我想知道如何做得更好。

我知道有很多关于此问题的问题,但没有一个问题完全相同(例如,有些问题只有数据框作为列表元素的列表,有时大小相同)。因此,尽管某些问题提供了一些帮助,但没有一个问题真正为我提供了足够的信息来解决我的问题。

谢谢

【问题讨论】:

  • “我想做的是首先将每个列表项(A,B)的名称添加到所有二阶列表元素中。” ——不要这样做。您正在使用名称中的字符污染数据中的数字,例如,cbind(matrix(11:19,ncol=3),c("B","B","B"))

标签: r list


【解决方案1】:

我认为可以利用this 回答中提出的功能。它反转列表结构,即按内部列表分组。一个例子:

# output from a package function
A <- list(a = matrix(1:9,ncol=3),
      b = matrix(1:8,ncol=4),
      c = 1.5)

B <- list(a = matrix(11:19,ncol=3),
      b = matrix(11:18,ncol=4),
      c = 2.5)

# list with all outputs (from loaded=lapply(filenames, function(x)      get(load(x))) )
superlist <- list(A, B)
################### your code above ##############
## the function from the linked answer
fun <-  function(ll) {
    nms <- unique(unlist(lapply(ll, function(X) names(X))))
    ll <- lapply(ll, function(X) setNames(X[nms], nms))
    ll <- apply(do.call(rbind, ll), 2, as.list)
    lapply(ll, function(X) X[!sapply(X, is.null)])
}

## apply the function to your list
insideout <- fun(superlist)

## rbind the components together
lapply(insideout, function(x) do.call(rbind, x))

这是你打算做的吗?

【讨论】:

  • 是的,这很好用!但是,您是否也知道如何添加带有名称的列(我的问题的第一部分)?正如弗兰克所说,它“污染了我的矩阵,但我不在乎(稍后,标签比“污染”更重要)。
  • 嗯,没有办法自动执行此操作,因为名称“A”和“B”由您选择,并且与您的数据无关(至少在您的示例中)。我也同意弗兰克的观点。将整个矩阵转换为具有标签的字符真的很糟糕。而是考虑使用 data.frame 并为名称添加一列或为矩阵使用行名。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-20
  • 1970-01-01
  • 2021-01-24
  • 1970-01-01
  • 2021-08-17
  • 1970-01-01
相关资源
最近更新 更多