R中嵌套列表中的子列表的平均元素

时间:2017-05-16 22:50:53

标签: r

我需要按以下方式平均嵌套子列表的元素。对于下面的示例,我列出了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
}

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)

您可以使用lapplysapply

来实现
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