lapply函数/在R中对列表的循环嵌套

24

我知道这个主题在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不会保持列表结构。希望能得到帮助并可能一些提示/解释。

1个回答

65

我们可以使用嵌套的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]])
    }
   }

1
哇,这太棒了(但对我来说有些不直观,因为我先学习的是传统循环)。只是为了理解这个想法,您介意展示一下它在传统for循环中的样子吗?这将帮助我了解索引结构,以防需要应用一些更复杂的函数。 - MIH
为什么您使用seq_along而不是像length这样的函数?这有关系吗? - MIH
4
@Anna 这取决于实践经验。我认为在某些情况下,“1:length”可能会失败。例如,当列表为空时,“l1 <- list();1:length(l1)# [1] 1 0; seq_along(l1)# integer(0)” - akrun
2
@akrun 我知道这已经是5年前的事了,但这对我太有帮助了,所以无论如何我还是要感谢你! - D.J
1
太棒了。真的很棒。非常感谢。 - user2550228

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接