在R中的列表元素上应用“dim”函数

时间:2013-08-15 13:50:45

标签: r list

我有n个列表,例如list1list2,...,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)

3 个答案:

答案 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)