4

我有n很多列表,比如说list1, list2, ..., listn。每个列表有 10 个元素,我需要计算每个列表的十个元素的“dim”的“平均值”。所以输出应该是一个长度向量n

例如输出向量的第一个元素应该是:

n1 = mean(dim(list1[[1]]), dim(list1[[2]]), dim(list1[[3]]), ..., dim(list1[[10]]) 

我知道如何使用for-loops 获得它,但我确信它不是最好的解决方案。

这些列表的结构源自名为“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)
4

3 回答 3

5

原始问题

lapply(或sapply)是你的朋友:

mean(sapply(mylist,dim))

如果您有许多具有统一含义和结构的列表,则应使用列表列表代替(即,mylist[[3]]代替mylist3)。

已编辑的问题

sapply(mylist, function(x) mean(sapply(x,dim)))

将返回内部列表均值的向量。

评论中的问题

如果您的列表包含矩阵而不是向量,并且您想要平均其中一个维度(dim(.)[1]dim(.)[2]),您可以使用ncolandnrow代替dim.

或者,您可以在那里传递任何函数,例如,

sapply(mylist, function(x) mean(sapply(x, function(y) sum(dim(y)))))

平均维度的总和。

于 2013-08-15T13:58:15.713 回答
3

如果您的所有对象都被调用"list*"并且您没有其他具有名称list的对象,您可以轻松地将所有列表粘贴到一个列表对象中,这样可以更轻松地对它们进行操作......

ll <- mget( ls( pattern = "list" ) )
sapply( ll , function(x) mean( sapply( x , dim ) )
于 2013-08-15T14:18:11.100 回答
1

这是使用Mapmylist 是您的列表的函数的解决方案:

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

要转换为矢量:

> do.call(rbind,k)
     [,1]
[1,]  2.5
[2,]  4.0

或者,

library(plyr)
ldply(k)
   V1
1 2.5
2 4.0

如果每个列表的元素都是矩阵:

Map(function(x) mean(dim(x[[1]])[1]:dim(x[[10]])[1]), mylist)
于 2013-08-15T14:28:20.943 回答