我有n
个列表,例如list1
,list2
,...,listn
。每个列表有10个元素,我需要计算每个列表中十个元素的“暗淡”的“均值”。因此输出应该是长度为n
的矢量。
例如,输出向量的第一个元素应为:
n1 = mean(dim(list1[[1]]), dim(list1[[2]]), dim(list1[[3]]), ..., dim(list1[[10]])
我知道如何使用for
- 循环来获取它,但我相信它不是最佳解决方案。
这些列表的结构来自一个名为“edgeR”的“Bioconductor”R包。 因此列表中的每个元素都具有以下结构:
$ :Formal class 'TopTags' [package "edgeR"] with 1 slots
.. ..@ .Data:List of 4
.. .. ..$ :'data.frame': 2608 obs. of 4 variables:
.. .. .. ..$ logFC : num [1:2608] 6.37 -6.48 -5.72 -5.6 -4.01 ...
.. .. .. ..$ logCPM: num [1:2608] 5.1 2.55 2.08 1.57 3.08 ...
.. .. .. ..$ PValue: num [1:2608] 3.16e-292 1.57e-187 2.15e-152 5.58e-141 1.27e-135 ...
.. .. .. ..$ FDR : num [1:2608] 7.37e-288 1.83e-183 1.67e-148 3.25e-137 5.92e-132 ...
.. .. ..$ : chr "BH"
.. .. ..$ : chr [1:2] "healthy" "cancerous"
.. .. ..$ : chr "exact"
由于每个列表都有10个元素,因此在运行时我有10个以上结构的重复:
str(list1)
答案 0 :(得分:4)
lapply
(或sapply
)是您的朋友:
mean(sapply(mylist,dim))
如果您有许多具有统一意义和结构的列表,则应使用列表列表(即mylist[[3]]
而不是mylist3
)。
sapply(mylist, function(x) mean(sapply(x,dim)))
将返回内部列表均值的向量。
如果您的列表包含矩阵而不是向量,并且您希望平均其中一个维度(dim(.)[1]
或dim(.)[2]
),则可以使用ncol
and nrow
代替dim
}。
或者,您可以在那里传递任何功能,例如
sapply(mylist, function(x) mean(sapply(x, function(y) sum(dim(y)))))
平均维度的总和。
答案 1 :(得分:3)
如果您的所有对象都被调用"list*"
并且您的没有其他对象,其中包含名称list
,则可以轻松地将所有列表粘贴到单个列表对象中这将使它们更容易操作...
ll <- mget( ls( pattern = "list" ) )
sapply( ll , function(x) mean( sapply( x , dim ) )
答案 2 :(得分:1)
以下是使用Map
函数的解决方案,其中mylist是您的列表:
Map(function(x) mean(x[[1]]:x[[10]]), mylist)
示例:
a<-list(1,2,3,4)
b<-list(2,3,5,6)
mylist<-list(a,b)
k<- Map(function(x) mean(x[[1]]:x[[4]]), mylist)
>k
[[1]]
[1] 2.5
[[2]]
[1] 4
转换为vector:
> do.call(rbind,k)
[,1]
[1,] 2.5
[2,] 4.0
OR,
library(plyr)
ldply(k)
V1
1 2.5
2 4.0
如果每个列表的元素都是矩阵:
Map(function(x) mean(dim(x[[1]])[1]:dim(x[[10]])[1]), mylist)