Свернуть кадр данных по группам, используя разные функции для каждой переменной - PullRequest
1 голос
/ 28 июня 2011

Определить

df<-read.table(textConnection('egg 1 20 a
                        egg 2 30 a
                        jap 3 50 b
                        jap 1 60 b'))

st

> df
   V1 V2 V3 V4
1 egg  1 20  a
2 egg  2 30  a
3 jap  3 50  b
4 jap  1 60  b

Мои данные не имеют факторов, поэтому я преобразовываю факторы в символы:

> df$V1 <- as.character(df$V1)
> df$V4 <- as.character(df$V4)  

Я хотел бы "свернуть""фрейм данных V1 с сохранением:

  • Макс. V2
  • Среднее значение V3
  • Режим V4 (это значение фактически не изменяется в пределах V1группы, так что первое, последнее и т. д. также могут подойти.)

Обратите внимание, что это общий вопрос, например, мой набор данных намного больше, и я могу захотеть использовать разные функции (например, last, first,min, max, дисперсия, st. dev. и т. д. для разных переменных) при свертывании.Следовательно, аргумент функции может быть довольно длинным.

В этом случае я бы хотел получить вывод вида:

> df.collapse
   V1 V2 V3 V4
1 egg  2 25  a
2 jap  3 55  b

Ответы [ 2 ]

8 голосов
/ 28 июня 2011
Пакет

plyr вам поможет:

library(plyr)
ddply(df, .(V1), summarize, V2 = max(V2), V3 = mean(V3), V4 = toupper(V4)[1])

Поскольку у R нет функции mode (возможно), я поставил другую функцию Но легко реализовать функцию режима.

5 голосов
/ 28 июня 2011

Я бы предложил использовать ddply из plyr:

require(plyr)
ddply(df, .(V1), summarise, V2=max(V2), V3=mean(V3), V4=V4[1])

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

do.call(rbind, lapply(split(df, df$V1), function(x) {
    data.frame(V2=max(x$V2), V3=mean(x$V3), V4=x$V4[1]))
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...