计算更深的列表级别R.

时间:2017-02-05 20:02:47

标签: r lapply

想象一下,我有两个级别的列表:

lll <- list()
lll[[1]] <- list(1:10, 1:5, 1:2)
lll[[2]] <- list(10:20, 20:30)
lll
 [[1]]
 [[1]][[1]]
  [1]  1  2  3  4  5  6  7  8  9 10

 [[1]][[2]]
 [1] 1 2 3 4 5

 [[1]][[3]]
  [1] 1 2


 [[2]]
 [[2]][[1]]
  [1] 10 11 12 13 14 15 16 17 18 19 20

 [[2]][[2]]
  [1] 20 21 22 23 24 25 26 27 28 29 30

我想要计算这些序列的平均值。我写了一个小函数,工作正常:

func <- function(list.list){
     lapply(1:length(list.list), function(i) mean(list.list[[i]]))
}

lapply(lll, func)

我不喜欢这个函数,我必须使用匿名函数。 当我有3个级别的列表时,它变得更加复杂。

也许你知道更好的方法来计算不包含匿名函数的计算方法吗?我应该使用高阶函数(MapReduce)吗?

我知道如何编写for周期,但在这种情况下,它不是一个选项。

1 个答案:

答案 0 :(得分:3)

这是一个在任何深度上工作的可能解决方案(使用rapply =递归应用):

lll <- list()
lll[[1]] <- list(1:10, 1:5, 1:2)
lll[[2]] <- list(10:20, 20:30)

res <- rapply(lll,mean,how='replace')
> res
[[1]]
[[1]][[1]]
[1] 5.5

[[1]][[2]]
[1] 3

[[1]][[3]]
[1] 1.5


[[2]]
[[2]][[1]]
[1] 15

[[2]][[2]]
[1] 25

设置参数how='unlist',您将得到:

res <- rapply(lll,mean,how='replace')
> res
[1]  5.5  3.0  1.5 15.0 25.0