Могу ли я объединить данные и сохранить строковые переменные в R? - PullRequest
4 голосов
/ 25 октября 2011

У меня есть фрейм данных вида:

  Family Code Length Type
1      A    1     11 Alpha
2      A    3      8 Beta
3      A    3      9 Beta
4      B    4      7 Alpha
5      B    5      8 Alpha
6      C    6      2 Beta
7      C    6      5 Beta
8      C    6      4 Beta

Я бы хотел сократить набор данных, содержащий уникальные значения кода, взяв среднее значение длины, но сохранив также все строковые переменные, т. Е.

  Family Code Length Type
1      A    1     11 Alpha
2      A    3    8.5 Beta
3      B    4      7 Alpha
5      B    5      8 Alpha
6      C    6   3.67 Beta

Я пробовал aggregate () и ddply (), но кажется, что они заменяют строки на NA, и я изо всех сил пытаюсь найти способ обойти это.

1 Ответ

15 голосов
/ 25 октября 2011

Поскольку Family и Type являются постоянными в группе Code, вы также можете "группировать" их, ничего не меняя при использовании ddply.Если ваш исходный набор данных был dat

ddply(dat, .(Family, Code, Type), summarize, Length=mean(Length))

, то дает

  Family Code  Type    Length
1      A    1 Alpha 11.000000
2      A    3  Beta  8.500000
3      B    4 Alpha  7.000000
4      B    5 Alpha  8.000000
5      C    6  Beta  3.666667

Если Family и Type не являются постоянными в группе Code, то вам потребуетсяопределить, как суммировать / агрегировать эти значения.В этом примере я просто беру одно уникальное значение:

ddply(dat, .(Code), summarize, Family=unique(Family), 
  Length=mean(Length), Type=unique(Type))

Обновление

Подобные опции при использовании dplyr:

 library(dplyr)
 dat %>% 
     group_by(Family, Code, Type) %>%
     summarise(Length=mean(Length))

и

  dat %>%
     group_by(Code) %>%
     summarise(Family=unique(Family), Length=mean(Length), Type=unique(Type))
...