Как применить функцию к столбцам матрицы по нескольким факторам в R?

это простой вопрос, и я уверен, что его легко решить с помощью tapply, apply, by и т. д. Однако я все еще относительно новичок в этом, и я хотел бы попросить совета.

Эта проблема:

У меня есть фрейм данных, скажем, с 5 столбцами. Колонки 4 и 5, скажем, множители. Для каждого фактора в столбце 5 я хочу выполнить функцию по столбцам 1:3 для каждой группы в моем столбце 5. Это, в принципе, легко выполнимо. Тем не менее, я хочу, чтобы на выходе была красивая таблица, и я хочу научиться делать это элегантно, поэтому я хотел бы спросить вас здесь.

Пример:

 df <- data.frame(x1=1:6, x2=12:17, x3=3:8, y=1:2, f=1:3)

Теперь команда

 by(df[,1:3], df$y, sum)

даст мне сумму на основе каждого уровня фактора в y, что почти то, что я хочу. Необходимы два дополнительных шага: первый — сделать это для каждого уровня фактора в f. Это почти тривиально. Я мог бы легко обернуть lapply вышеприведенную команду и получить то, что хочу, за исключением этого: я хочу создать таблицу с результатами и, возможно, даже использовать ее для создания тепловой карты.

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

Спасибо за любую помощь или любой намек, каким бы маленьким он ни был!


person coffeinjunky    schedule 20.08.2013    source источник


Ответы (1)


Для этого можно использовать пакеты reshape2 и plyr.

library(plyr)
df2 <- ddply(df, .(y, f), sum)

а затем превратить его в матрицу f на y:

library(reshape2)
acast(df2, f ~ y, value.var = "V1")
person mengeln    schedule 20.08.2013
comment
Вы действительно хотите суммировать значения y и f? - person thelatemail; 21.08.2013
comment
Спасибо за решение! Я еще не до конца понял это, так как никогда раньше не работал с plyr, но это, по крайней мере, кажется многообещающим. - person coffeinjunky; 21.08.2013
comment
@thelatemail Думайте о f как о городе, а y как о годе. Для каждого года я хочу иметь каждую сумму x_i в каждом городе. Думайте о x1 как о количестве автомобильных аварий, x2 как о велосипедных авариях и т. д. Это означает, что сами факторы не имеют смысла, и мне просто нужно количество аварий для каждого типа в каждом городе. Вероятно, мне следовало указать это в своем вопросе, чтобы упростить понимание проблемы. Извини за это. - person coffeinjunky; 21.08.2013
comment
@ user2378649 - в этом случае это должен сделать aggregate: aggregate(. ~ y + f, data=df, sum) или aggregate(cbind(x1,x2,x3) ~ y + f, data=df, sum), чтобы явно указать столбцы xN. - person thelatemail; 21.08.2013