想象一下,我有两个级别的列表:
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个级别的列表时,它变得更加复杂。
也许你知道更好的方法来计算不包含匿名函数的计算方法吗?我应该使用高阶函数(Map
,Reduce
)吗?
我知道如何编写for
周期,但在这种情况下,它不是一个选项。
答案 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