【问题标题】:lapply function /loops on list of lists Rlapply函数/循环列表R
【发布时间】:2015-10-12 05:12:02
【问题描述】:

我知道这个话题在 SO 上出现过几次,但这些例子通常比较复杂,我想对这个简单的情况有一个答案(或一组可能的解决方案)。总的来说,我仍然在围绕 R 和编程。所以在这里我想使用lapply 函数或一个简单的循环到data 列表,这是三个向量列表的列表。

data1 <- list(rnorm(100),rnorm(100),rnorm(100))
data2 <- list(rnorm(100),rnorm(100),rnorm(100))
data3 <- list(rnorm(100),rnorm(100),rnorm(100))

data <- list(data1,data2,data3)

现在,我想获取每个向量的均值列表。结果将是三个元素的列表(列表)。

我只知道如何获取向量列表的结果列表和

for (i in 1:length(data1)){
        means <- lapply(data1,mean)
}

或通过:

lapply(data1,mean)

而且我知道如何使用rapply 获得所有方法:

rapply(data,mean)

问题是 rapply 不维护列表结构。 非常感谢您的帮助和一些提示/解释。

【问题讨论】:

    标签: r list loops lapply


    【解决方案1】:

    我们可以用嵌套的lapply/sapply遍历列表列表

     lapply(data, sapply, mean)
    

    另外写成

     lapply(data, function(x) sapply(x, mean))
    

    或者如果你需要list结构的输出,可以使用嵌套的lapply

     lapply(data, lapply, mean)
    

    或者使用rapply,我们可以使用参数how来得到我们想要的输出。

      rapply(data, mean, how='list')
    

    如果我们使用for 循环,我们可能需要创建一个对象来存储结果。

      res <- vector('list', length(data))
      for(i in seq_along(data)){
        for(j in seq_along(data[[i]])){
          res[[i]][[j]] <- mean(data[[i]][[j]])
        }
       }
    

    【讨论】:

    • 哇,这太棒了(而且对我来说完全不直观,因为我首先学习了传统循环)。只是为了掌握这个想法,你介意展示它在传统 for 循环中的样子吗?这将帮助我了解索引结构,以防我需要应用一些更复杂的功能
    • 为什么你使用 seq_along 而不是 length ?有关系吗?
    • @Anna 这是练习。我认为1:length 在某些情况下可能会失败。例如,l1 &lt;- list();1:length(l1)# [1] 1 0; seq_along(l1)# integer(0)
    • @akrun 我知道这已经 5 岁了,但我这很有帮助,我还是要感谢你!
    猜你喜欢
    • 2015-10-11
    • 2021-02-16
    • 2019-10-22
    • 1970-01-01
    • 1970-01-01
    • 2018-01-15
    • 2020-10-16
    • 2020-09-11
    相关资源
    最近更新 更多