我需要按以下方式平均嵌套子列表的元素。对于下面的示例,我列出了lll。我想为lll [[1]]计算子列表的平均值(1 + 3 + 5 + 7)/ 4 = 4,(2 + 4 + 6 + 8)/ 4 = 5。类似地,对于lll [[2]]子列表的计算平均值,我们具有(2 + 4 + 6 + 8)/ 4 = 5,(1 + 3 + 5 + 7)= 4。我可以使用for循环执行此操作,但结果不是所希望的。因为我希望列表或数据框是水平的,例如list(c(4,5),c(5,4))。当我有一个5000个元素的循环列表时效率不高。真的很欣赏一种更聪明的方法。
l1<-as.matrix(c(1,2))
l2<-as.matrix(c(3,4))
l3<-as.matrix(c(5,6))
l4<-as.matrix(c(7,8))
l5<-as.matrix(c(2,1))
l6<-as.matrix(c(4,3))
l7<-as.matrix(c(6,5))
l8<-as.matrix(c(8,7))
ll1<-list(l1,l2,l3,l4)
ll2<-list(l5,l6,l7,l8)
lll<-list(ll1,ll2)
### using for loop
sum_k_a_<-list()
sum_k_b_<-list()
for (l in 1:2){
sum_k_a<-0
sum_k_b<-0
for (k in 1:4){
sum_k_a=lll[[l]][[k]][1]+sum_k_a
sum_k_b=lll[[l]][[k]][2]+sum_k_b
}
sum_k_a_[[l]]<-sum_k_a/4
sum_k_b_[[l]]<-sum_k_b/4
}
答案 0 :(得分:3)
有两种选择:
lapply(lll, function(x) Reduce(`+`, x)/length(x) )
#[[1]]
# [,1]
#[1,] 4
#[2,] 5
#
#[[2]]
# [,1]
#[1,] 5
#[2,] 4
lapply(lll, function(x) rowMeans(do.call(cbind, x)))
#[[1]]
#[1] 4 5
#
#[[2]]
#[1] 5 4
答案 1 :(得分:2)
您可以使用lapply
和sapply
:
lapply(lll,function(x) rowSums(sapply(x,function(y) c(y[1],y[2]))/4))
这将返回2个元素的列表:
[[1]]
[1] 4 5
[[2]]
[1] 5 4
答案 2 :(得分:2)
我们也可以使用tidyverse
语法
library(tidyverse)
lll %>%
map(~Reduce(`+`, .)/length(.))
#[[1]]
# [,1]
#[1,] 4
#[2,] 5
#[[2]]
# [,1]
#[1,] 5
#[2,] 4
答案 3 :(得分:1)
使用隐式sapply
循环将mean
应用于unlist
- 更深入&#34;更深入&#34;在列表结构中:
L_means <- sapply( lll, FUN=function(items) {mean( unlist(items))})
L_means
[1] 4.5 4.5
我想我误解了这个问题,所以这就是我们想要的:
(L_means <- sapply( lll, FUN=function(top){ apply( as.data.frame(top), 1, mean)}) )
[,1] [,2]
[1,] 4 5
[2,] 5 4