Поиск средних и средних по фреймам данных в r - PullRequest
4 голосов
/ 21 декабря 2010

У меня есть несколько фреймов данных, a b c d, каждый с одинаковыми именами столбцов. Я хочу найти среднее значение и медиану этих фреймов данных. Другими словами, создайте новые фреймы данных mean и median того же размера, что и a, b и т. Д.

Я мог бы использовать пару for циклов, но держу пари, что есть хитрый способ сделать это, используя встроенные функции R. Это было бы быстрее.

Ответы [ 3 ]

9 голосов
/ 21 декабря 2010

После ответа Джоша Ульриха, как насчет

library(abind)
apply(abind(a,b,c,d,along=3),c(1,2),median)

? (Использование rowMeans на соответствующем срезе все равно будет быстрее, чем apply ing mean ... Я думаю, что в пакете Biobase (Bioconductor) есть rowMedians, если вам действительно нужна скорость?)

2 голосов
/ 21 декабря 2010

Я не уверен, что ответ JD даст вам именно то, что вы хотите, так как результирующий объект не будет иметь те же размеры, что и a, b и т. Д.в список это хорошее начало, хотя.Затем вы можете поместить каждый столбец в новый список, cbind этот список в матрицу и использовать apply над его строками.

a <- data.frame(rnorm(10), runif(10))
b <- data.frame(rnorm(10), runif(10))
c <- data.frame(rnorm(10), runif(10))
d <- data.frame(rnorm(10), runif(10))
myList <- list(a,b,c,d)
sapply(1:ncol(a), function(j) {  # median
  apply(do.call(cbind,lapply(myList,`[`,,j)), 1, median)
})
sapply(1:ncol(a), function(j) {  # mean
  apply(do.call(cbind,lapply(myList,`[`,,j)), 1, mean)
})
sapply(1:ncol(a), function(j) {  # faster mean
  rowMeans(do.call(cbind,lapply(myList,`[`,,j)))
})
1 голос
/ 21 декабря 2010

вы можете поместить ваши фреймы данных в список фреймов данных, а затем использовать lapply(myList, mean, ...)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...