列表列表R上的lapply函数/循环

MIH*_*MIH 17 loops r list lapply

我知道这个主题在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)
Run Code Online (Sandbox Code Playgroud)

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

我只知道如何获得矢量列表的结果列表

for (i in 1:length(data1)){
        means <- lapply(data1,mean)
}
Run Code Online (Sandbox Code Playgroud)

或者:

lapply(data1,mean)

我知道如何使用所有方法rapply:

rapply(data,mean)

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

akr*_*run 46

我们可以使用嵌套循环遍历列表 lapply/sapply

 lapply(data, sapply, mean)
Run Code Online (Sandbox Code Playgroud)

否则写成

 lapply(data, function(x) sapply(x, mean))
Run Code Online (Sandbox Code Playgroud)

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

 lapply(data, lapply, mean)
Run Code Online (Sandbox Code Playgroud)

或者rapply,我们可以使用参数how来获得我们想要的输出类型.

  rapply(data, mean, how='list')
Run Code Online (Sandbox Code Playgroud)

如果我们使用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]])
    }
   }
Run Code Online (Sandbox Code Playgroud)

  • @Anna这是通过练习.我认为`1:length`在某些情况下会失败.例如,`l1 < - list(); 1:length(l1)#[1] 1 0; seq_along(l1)#integer(0)` (3认同)
  • 更新了帖子 (2认同)
  • @akrun 我知道这已经有 5 年历史了,但这对我很有帮助,无论如何我都要感谢你! (2认同)