средние значения столбцов по всем строкам фрейма данных - PullRequest
9 голосов
/ 20 марта 2011

У меня есть фрейм данных, который я читаю из файла, подобного этому:

name, points, wins, losses, margin
joe, 1, 1, 0, 1
bill, 2, 3, 0, 4
joe, 5, 2, 5, -2
cindy, 10, 2, 3, -2.5

и т. Д.

Я хочу усреднить значения столбцов по всем строкам этих данныхЕсть ли простой способ сделать это в R?

Например, я хочу получить средние значения столбца для всех "Джо", получая что-то вроде

joe, 3, 1.5, 2.5, -.5

Ответы [ 4 ]

13 голосов
/ 20 марта 2011

После загрузки данных:

df <- structure(list(name = structure(c(3L, 1L, 3L, 2L), .Label = c("bill", "cindy", "joe"), class = "factor"), points = c(1L, 2L, 5L, 10L), wins = c(1L, 3L, 2L, 2L), losses = c(0L, 0L, 5L, 3L), margin = c(1, 4, -2, -2.5)), .Names = c("name", "points", "wins", "losses", "margin"), class = "data.frame", row.names = c(NA, -4L))

Просто используйте функцию aggregate:

> aggregate(. ~ name, data = df, mean)
   name points wins losses margin
1  bill      2  3.0    0.0    4.0
2 cindy     10  2.0    3.0   -2.5
3   joe      3  1.5    2.5   -0.5
8 голосов
/ 20 марта 2011

Обязательные plyr и reshape решения:

library(plyr)
ddply(df, "name", function(x) mean(x[-1]))


library(reshape)
cast(melt(df), name ~ ..., mean)
3 голосов
/ 20 сентября 2012

И решение data.table для простого синтаксиса и эффективности использования памяти

library(data.table)
DT <- data.table(df)
DT[,lapply(.SD, mean), by = name]
1 голос
/ 20 ноября 2011

У меня есть еще один способ. Я показываю это на другом примере.

Если у нас есть матрица xt как:

a b c d
A 1 2 3 4
A 5 6 7 8
A 9 10 11 12
A 13 14 15 16
B 17 18 19 20
B 21 22 23 24
B 25 26 27 28
B 29 30 31 32
C 33 34 35 36
C 37 38 39 40
C 41 42 43 44
C 45 46 47 48

Среднее значение для дублированных столбцов можно вычислить за несколько шагов:
1. Вычислите среднее значение, используя агрегат функцию
2. Сделайте две модификации: совокупные записи имена строк как новый (первый) столбец, поэтому вы должны определить его обратно как имена строк ...
3 .... и удалите этот столбец, выбрав столбцы 2: количество столбцов объекта xa.

xa=aggregate(xt,by=list(rownames(xt)),FUN=mean)
rownames(xa)=xa[,1]
xa=xa[,2:5]

После этого получаем:

a b c d
A 7 8 9 10
B 23 24 25 26
C 39 40 41 42

...