2015-01-18 20 views
7

Zapełniam listy w pętli for(). Próbka wyniku znajduje się poniżej.Próba generowania średnich na wielu listach

dta <- list(structure(c(128L, 175L), .Dim = 2L, .Dimnames = structure(list(
    c("0", "1")), .Names = ""), class = "table"), structure(c(132L, 
171L), .Dim = 2L, .Dimnames = structure(list(c("0", "1")), .Names = ""), class = "table"), 
    structure(c(130L, 173L), .Dim = 2L, .Dimnames = structure(list(
     c("0", "1")), .Names = ""), class = "table"), structure(c(133L, 
    170L), .Dim = 2L, .Dimnames = structure(list(c("0", "1")), .Names = ""), class = "table")) 

Każda lista pokazuje liczbę 0 i 1 dla danego zestawu danych.

> head(dta) 
[[1]] 

    0 1 
128 175 

[[2]] 

    0 1 
132 171 

[[3]] 

    0 1 
130 173 

[[4]] 

    0 1 
133 170 

lapply() funkcja, że ​​jestem przyzwyczajony do korzystania działa w listach (tj znajdzie sumę elementów w danej listy). Tutaj chcę średnią na listach. Niejednoznacznie, chcę średniej liczby 0 i 1, które pojawiły się na każdej liście (tj. Do średniej 0, chcę sumę 128,132,130,133 podzielić przez 4).

Wszelkie sugestie będą mile widziane.

+1

Jak o 'colMeans (Matrix (wyświetlać na liście (DTA), Ncol = 2, byrow = PRAWDA))' ? –

Odpowiedz

5

Można spróbować

library(reshape2) 
library(data.table) 
setDT(melt(dta))[, mean(value), Var1] 

Albo

colMeans(do.call(rbind, dta)) 
+0

Świetnie. Wygląda na to wiele sposobów! Dziękuję za szybką, pomocną i informacyjną odpowiedź dla Ciebie i wszystkich poniżej! –

+0

Czy nie trzeba podawać argumentu "by" w tabeli danych? Zawsze myślałem, że zrobiłeś to. –

+0

Przynajmniej nie jest to potrzebne w 'data.table 1.9.5'. Jeśli istnieje więcej niż jedna zmienna, '. (Var1 Var2)]'. Aby lepiej zrozumieć, można go używać. – akrun

5

Można użyć tapply()

u <- unlist(dta) 
tapply(u, names(u), mean) 
#  0  1 
# 130.75 172.25 
3

inne podejście:

sapply(split(unlist(dta), 0:1), mean) 
#  0  1 
# 130.75 172.25 
3
colMeans(matrix(unlist(dta), ncol = 2, byrow = TRUE)) 
#[1] 130.75 172.25 

lub dplyr & reshape2:

library(reshape2); library(dplyr) 
melt(dta) %>% group_by(Var1) %>% summarise(mean = mean(value)) 
#Source: local data frame [2 x 2] 
# 
# Var1 mean 
#1 0 130.75 
#2 1 172.25 
4

Tutaj jest podejście z użyciem Reduce

Reduce(`+`, dta)/length(dta) 
#  0  1 
# 130.75 172.25 
Powiązane problemy