R: совокупные столбцы data.frame - PullRequest
7 голосов
/ 28 июля 2010

У меня есть data.frame, который выглядит следующим образом

> head(df)
            Memory    Memory    Memory    Memory    Memory     Naive     Naive
10472501  6.075714  5.898929  6.644946  6.023901  6.332126  8.087944  7.520194
10509163  6.168941  6.495393  5.951124  6.052527  6.404401  7.152890  8.335509
10496091 10.125575  9.966211 10.075613 10.310952 10.090649 11.803949 11.274480
10427035  6.644921  6.658567  6.569745  6.499243  6.990852  8.010784  7.798154
10503695  8.379494  8.153917  8.246484  8.390747  8.346748  9.540236  9.091740
10451763 10.986717 11.233819 10.643245 10.230697 10.541396 12.248487 11.823138  

, и я хотел бы найти среднее значение столбцов Memory и среднее значение столбцов Naive. Функция aggregate агрегирует строки. Это data.frame потенциально может иметь большое количество строк, и, следовательно, транспонирование с применением aggregate к colnames оригинального data.frame кажется мне плохим и, как правило, раздражает:

> head(t(aggregate(t(df),list(colnames(df)), mean)))
         [,1]       [,2]      
Group.1  "Memory"   "Naive"   
10472501 "6.195123" "8.125439"
10509163 "6.214477" "7.733625"
10496091 "10.11380" "11.55348"
10427035 "6.672665" "8.266854"
10503695 "8.303478" "9.340436"

Что за ослепительно очевидная вещь мне не хватает?

Ответы [ 5 ]

8 голосов
/ 28 июля 2010

Я большой сторонник переформатирования данных, чтобы они были в «длинном» формате. Полезность длинного формата особенно очевидна, когда дело доходит до таких проблем, как эта. К счастью, с помощью пакета reshape достаточно легко преобразовать подобные данные практически в любой формат.

Если я правильно понял ваш вопрос, вам нужно среднее значение Memory и Naive для каждой строки. По какой-то причине нам нужно сделать имена столбцов уникальными для reshape::melt().

colnames(df) <- paste(colnames(df), 1:ncol(df), sep = "_")

Затем вам нужно будет создать столбец ID. Вы могли бы либо сделать

df$ID <- 1:nrow(df)

или, если эти имена строк имеют смысл

df$ID <- rownames(df)

Теперь, с пакетом reshape

library(reshape)
df.m <- melt(df, id = "ID")
df.m <- cbind(df.m, colsplit(df.m$variable, split = "_", names = c("Measure", "N")))
df.agg <- cast(df.m, ID ~ Measure, fun = mean)

df.agg теперь должно выглядеть как ваш желаемый фрагмент вывода.

Или, если вам нужны только общие средства по всем строкам, предложение Зака ​​сработает. Что-то вроде

m <- colMeans(df)
tapply(m, colnames(df), mean)

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

cast(df.m, .~variable, fun = mean)
4 голосов
/ 28 июля 2010

Как насчет чего-то вроде

l <-lapply(unique(colnames(df)), function(x) rowMeans(df[,colnames(df) == x]))



df <- do.call(cbind.data.frame, l)
3 голосов
/ 28 июля 2010

Чтобы прояснить ответ Джонатана Чанга ... слепо очевидная вещь, которую вам не хватает, это то, что вы можете просто выбрать столбцы и выполнить команду rowMeans.Это даст вектор средств для каждой строки.Его команда получает значение строки для каждой группы уникальных имен столбцов и было именно тем, что я собирался написать.С вашими примерами данных результат его команды - два списка.

rowMeans также очень быстр.

Чтобы разбить его, получить средства только для всех ваших столбцов памяти просто

rowMeans(df[,colnames(df) == 'Memory']) #or from you example, rowMeans(df[,1:5])

Это самый простой и правильный ответ, проголосуйте за него и отметьте его правильно, если он вам нравится.

(Кстати, мне также понравилась рекомендация Джо, как правило, хранить данные как длинные данные).

0 голосов
/ 16 июня 2014
m = matrix(1:12,3)
colnames(m) = c(1,1,2,2)

m

     1 1 2  2
[1,] 1 4 7 10
[2,] 2 5 8 11
[3,] 3 6 9 12

mt = t(m)
sapply(by(mt,rownames(mt),colMeans),identity)

     1    2
V1 2.5  8.5
V2 3.5  9.5
V3 4.5 10.5
0 голосов
/ 28 июля 2010

Я думаю, что вы загрузили свои данные без header=TRUE, и у вас есть фактор-матрица, поэтому ваша в целом хорошая идея не удалась.

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