我有一个列表,其中包含以下列表:
# 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个)。我知道我可以写一个循环,但由于我将经常使用该函数,我想知道如何做得更好。
我知道有很多问题要问这个,但是没有一个问题具有完全相同的问题(例如,有些只有数据框作为列表元素列表,有时大小都相同)。因此,虽然某些问题提供了一些帮助,但没有一个真正给我足够的信息来解决我的问题。
谢谢
答案 0 :(得分:0)
我认为可以利用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))
这是你打算做的吗?