2015-01-18 5 views
7

Я заполняю списки в цикле for(). Пример результата приведен ниже.Пытается генерировать средние значения по нескольким спискам

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")) 

В каждом списке показано количество 0 и 1 для заданного набора данных.

> head(dta) 
[[1]] 

    0 1 
128 175 

[[2]] 

    0 1 
132 171 

[[3]] 

    0 1 
130 173 

[[4]] 

    0 1 
133 170 

lapply() функция, я привык к использованию действует в списках (т.е. находит сумму элементов в пределах данного списка). Здесь я хочу средний по спискам. В равной степени, я хочу, чтобы среднее число 0 и 1 произошло в каждом списке (т. Е. Чтобы усреднить 0, я хочу, чтобы сумма 128,132,133,133 разделилась на 4).

Любые предложения будут оценены.

+1

Как насчет 'colMeans (матрица (unlist (ДТА), Ncol = 2, byrow = TRUE))' ? –

ответ

5

Вы можете попробовать

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

Или

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

Отлично. Похоже, там много способов! Спасибо за быстрый, полезный и информативный ответ вам и всем ниже! –

+0

Вам не нужно называть аргумент 'by' в таблице данных? Я всегда думал, что вы сделали –

+0

По крайней мере, он не нужен в 'data.table 1.9.5'. Если имеется более одной переменной, '. (Var1 Var2)]'. Для лучшего понимания его можно использовать. – akrun

5

Вы можете использовать tapply()

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

Другой подход:

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 

или 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

Вот подход с использованием Reduce

Reduce(`+`, dta)/length(dta) 
#  0  1 
# 130.75 172.25 
Смежные вопросы