2015-07-26 4 views
1

У меня есть список data.frame с структурированных как так:Have список data.frames, хотите средства через список элементов

mylist <- list(x=data.frame(group=1:3, x=c(43, 29, 49)), 
       y=data.frame(group=1:3, x=c(29, 39, 11)), 
       z=data.frame(group=1:3, x=c(20, 38, 98))) 

Таким образом, каждый data.frame имеет две колонки. Я хочу получить среднее значение этих строк: data.frame. Таким образом, первое среднее значение будет (43+29+20)/3, второе (29+39+38)/3 и третье (49+11+98)/3.

ответ

5

Попробуйте

Reduce(`+`, mylist)/length(mylist) 
# group  x 
#1  1 30.66667 
#2  2 35.33333 
#3  3 52.66667 

Или

library(data.table) 
rbindlist(mylist)[, list(x=mean(x)), group] 
# group  x 
#1:  1 30.66667 
#2:  2 35.33333 
#3:  3 52.66667 

Или

library(tidyr) 
library(dplyr) 
unnest(mylist) %>% 
      group_by(group) %>% 
      summarise(x=mean(x)) 

На основе результатов показал в пост ФП в

(43+29+20)/3 
#[1] 30.66667 

(29+39+38)/3 
#[1] 35.33333 

(49+11+98)/3 
#[1] 52.66667 
+0

Это первый один не работает, так как он выводит один номер, где я хочу три числа. Один для каждой строки – Alex

+0

@Alex Я обновил сообщение с результатом, я получил – akrun

+0

ах, у меня была опечатка. Отлично работает, спасибо – Alex

2

Игра с dim

rowMeans(simplify2array(unlist(mylist, rec=F))[,c(F,T)]) 

или, в явном виде

rowMeans(`dim<-`(unlist(mylist), dim(mylist[[1]])*c(1, length(mylist)))[,c(F, T)]) 
# [1] 30.66667 35.33333 52.66667