R-форматировать data.frame в другой «комбинированный» data.frame на основе общих значений в столбце, зависящем от разных столбцов.

Я начинаю с фрейма данных, состоящего из трех столбцов. Столбец № 1 содержит идентификаторы, указывающие на 3 разных периода времени, когда вес (столбец № 3) некоторых людей (столбец № 2) измерялся в кг.

Все люди были измерены нерегулярно, что означает, что некоторые люди были измерены несколько раз или только один раз в течение периода времени, но не за все периоды времени.

   id       person_name person_weight
    1          Carol         51
    1          Mike          76
    1          Mike          81
    1          Dave          66
    1          Carol         59
    2          James         78
    2          Simone        55
    2          Simone        49
    2          David         85
    3          Mike          93
    3          Dave          110
    3          Dave          98 

На самом деле, все это просто упрощенный пример... так что не беспокойтесь, если такой сбор данных не имеет смысла.

Теперь я хочу рассчитать средний (средний) вес для каждого человека за определенный период времени, а затем получить объединенный фрейм данных, который выглядит следующим образом:

group_id    Carol   Mike    Dave    James   Simone  David
   1         55     78.5     66      NA       NA     NA
   2         NA      NA      NA      78       52     85
   3         NA      93      104     NA       NA     NA

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

Заранее спасибо за любую помощь, которая приблизит меня ко второму/"комбинированному" кадру данных.


r
person myX.    schedule 04.06.2013    source источник
comment
Думаю, здесь не помешал бы словарный запас. Ваш первый набор данных, в котором каждое измерение является отдельной записью, называется данными формата long. Существует два соответствующих формата wide: один со строкой для каждой группы (той, которую вы хотите), а другой со строкой для каждого человека. Переключение между длинным и широким форматами обычно называется reshaping; мы melt широкие данные в длинные данные и cast длинные данные в широкие данные. Это мощные концепции, и reshape2 — их отличная реализация, которая делает жизнь намного проще. Стоит потратить время на изучение.   -  person Matt Parker    schedule 04.06.2013
comment
Стоит потратить время на изучение. Решение Джорана одобрило ваше предложение.   -  person myX.    schedule 05.06.2013


Ответы (1)


Похоже на простое dcast:

library(reshape2)
dcast(dat,id ~person_name,
      fun.aggregate = mean,
      value.var = "person_weight",fill = NA_real_)
  id Carol Dave David James Mike Simone
1  1    55   66    NA    NA 78.5     NA
2  2    NA   NA    85    78   NA     52
3  3    NA  104    NA    NA 93.0     NA
person joran    schedule 04.06.2013