【问题标题】:Applying "dim" function over elements of a list in R在 R 中的列表元素上应用“dim”函数
【发布时间】:2013-08-15 13:50:44
【问题描述】:

我有n 的列表数量,比如说list1list2、...、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)

【问题讨论】:

  • 可以分享list1(str(list1))的结构
  • 你认为如何使用for 循环来迭代变量 list1..list10
  • @SimonO101 我添加了上面的编辑
  • @SimonO101 非常感谢。再问一个问题,我就不会再问任何关于 sapply 的问题了。如果我想从“list*”中计算相应元素的暗度平均值怎么样?像这样: n1 = mean(dim(list1[[1]], list2[[1]], list3[[1]], ...,listn[[1]])) 然后 n10 = mean(dim( list1[[10]], list2[[10]], ..., listn[[10]]))
  • @hora 我不确定我是否理解。你能在你的数据结构中包含一个dput

标签: r list


【解决方案1】:

原问题

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

平均维度总和。

【讨论】:

  • 是的,但我有 n 个列表。我应该再次使用“for”循环来为所有这些重复上述命令吗?
  • 是的,但我有列表。所以我已经有了:list3[[1]]、list3[[2]]、...、list3[[10]]。然后我有 n 个 list3 类型的列表
  • 还有一个问题:如果我需要计算“dim”函数的第一个元素的平均值,例如:mean(dim(l1)[1],dim(l2)[1],. ..)
  • sapply 中使用function(x) dim(x)[1] 而不是dim
  • 单词list 只是变量的名称,我想我在那里不太一致 - 已修复
【解决方案2】:

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

ll <- mget( ls( pattern = "list" ) )
sapply( ll , function(x) mean( sapply( x , dim ) )

【讨论】:

    【解决方案3】:

    这是使用 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
    

    要转换成矢量:

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

    【讨论】:

      猜你喜欢
      • 2012-11-01
      • 2022-08-04
      • 1970-01-01
      • 2020-02-27
      • 2020-01-14
      • 1970-01-01
      • 2021-02-03
      • 1970-01-01
      • 2019-05-26
      相关资源
      最近更新 更多