2015-10-08 2 views
0

Скажем, у меня есть 3 кадра данных, каждый 5x5 объект как таковой:Как вычислить средства по строкам из трех многокаскадных данных?

set.seed(1) 
x <-as.data.frame(matrix(rnorm(10),ncol=5,nrow=5)) 
colnames(x) <-c("a","b","c","d","e") 

y <-as.data.frame(matrix(rnorm(10),ncol=5,nrow=5)) 
colnames(y) <-c("f","g","h","i","j") 

z <-as.data.frame(matrix(rnorm(10),ncol=5,nrow=5)) 
colnames(z) <-c("k","l","m","n","o") 

Так, х, к примеру, выглядит следующим образом:

> x 
      a   b   c   d   e 
1 -0.6264538 -0.8204684 -0.6264538 -0.8204684 -0.6264538 
2 0.1836433 0.4874291 0.1836433 0.4874291 0.1836433 
3 -0.8356286 0.7383247 -0.8356286 0.7383247 -0.8356286 
4 1.5952808 0.5757814 1.5952808 0.5757814 1.5952808 
5 0.3295078 -0.3053884 0.3295078 -0.3053884 0.3295078 

Как эффективно рассчитать средства по строкам для трех значений в одном и том же месте в каждом кадре данных? То есть, например, вычислить среднее значение для трех значений в строке 1/col 1 по кадрам данных. Легко сделать вручную, конечно. Например:

> mean(c(x$a[1],y$f[1],z$k[1])) 
[1] 0.6014349 

> mean(c(x$b[1],y$g[1],z$l[1])) 
[1] -0.3071769 

... и так далее. Но как я могу сделать это эффективно в R для гораздо больших кадров данных? Я попробовал mapply() и варианты apply() и sweep(), но не повезло. Я знаю, что есть простое решение, но у меня есть мозговой замок. Любая помощь будет принята с благодарностью!

+3

Почему не '(х + у + г)/3' –

+0

Так что вы хотите 25 средств? –

+0

Ричард, да, 25 означает - матрица 5x5. –

ответ

4

Я чувствую, что я должен поставить мое тривиальное решение как ответ ...

(x+y+z)/3 
+0

Martin, это работает - и дополнительные точки для простоты и поддержки формата фрейма данных. Благодаря! Как я пропустил это? –

+0

Ну, иногда вам нужно сделать шаг назад, чтобы увидеть простые вещи;) –

1

Вы можете преобразовать кадры данных в матрицы, вычислить среднее значение и преобразовать среднюю матрицу обратно в формат фрейма данных. Вот код:

xx <- data.matrix(x) 
yy <- data.matrix(y) 
zz <- data.matrix(z) 
mm <- (xx+yy+zz)/3 
mean.df <- data.frame(mm) 
+0

'data.frames' можно суммировать и т. Д., Если они имеют одинаковые размеры. Нет необходимости в преобразовании 'matrix' – thelatemail

1

другой apporach:

rowMeans(sapply(list(x, y, z), function(x) unlist(x, use.names=FALSE))) 

или, чтобы получить 5x5 назад и с более быстрым .rowMeans

rc <- dim(x) 
d <- list(x, y, z) 
r <- .rowMeans(sapply(d, function(x) unlist(x, use.names=FALSE)), prod(rc), length(d)) 
m <- matrix(r, nrow=rc[1]) 
+0

RobertH, структура 5x5 не выполняется. Есть ли модификация для этого? –

+0

добавил альтернативу, которая возвращает значения обратно в матрицу – RobertH

1

Вот один из способов обобщить, сохраняя при этом выход матрицы:

apply(sapply(list(x,y,z), as.matrix, simplify="array"), 1:2, mean) 
#    a   b   c   d   e 
#[1,] 0.6014349 -0.30717691 0.6014349 -0.30717691 0.6014349 
#[2,] 0.4518743 0.10514776 0.4518743 0.10514776 0.4518743 
#[3,] -0.4607681 0.07046951 -0.4607681 0.07046951 -0.4607681 
#[4,] -0.8695903 0.30628416 -0.8695903 0.30628416 -0.8695903 
#[5,] 0.6914215 0.23548483 0.6914215 0.23548483 0.6914215 
+0

. Применение (sapply() является интересным. Полезно иметь в виду соответствующие усилия. –

Смежные вопросы