собираются () для сгруппированных переменных в R для определенных столбцов - PullRequest
0 голосов
/ 19 октября 2019

У меня длинный фрейм данных с решениями игроков, которые работали в группах. Мне нужно преобразовать данные таким образом, чтобы в каждой строке (отдельном наблюдении) содержались решения всех членов группы (поэтому мы в основном можем видеть, являются ли они взаимозависимыми).

Скажем, генерирующий код:

group_id <- c(rep(1, 3), rep(2, 3))
player_id <- c(rep(seq(1, 3), 2))
player_decision <- seq(10,60,10)
player_contribution <- seq(6,1,-1)
df <-
  data.frame(group_id, player_id, player_decision, player_contribution)

Итак, исходные данные выглядят так:

  group_id player_id player_decision player_contribution
1        1         1              10                   6
2        1         2              20                   5
3        1         3              30                   4
4        2         1              40                   3
5        2         2              50                   2
6        2         3              60                   1

Но мне нужно преобразовать их в wide для каждогогруппа, но только для некоторых из этих переменных (в этом примере специально для player_contribution, но таким образом, что остальная часть данных остается. Таким образом, заголовок преобразованных данных будет:

data.frame(group_id=c(1,1), 
           player_id=c(1,2),
           player_decision=c(10,20),
           player_1_contribution=c(6,6),
           player_2_contribution=c(5,5),
           player_3_contribution=c(4,6)
           )
  group_id player_id player_decision player_1_contribution player_2_contribution player_3_contribution
1        1         1              10                     6                     5                     4
2        1         2              20                     6                     5                     6

Я подозреваю, что мне нужно group_by в dplyr, а затем как-то gather на группу, но только для player_contribution (или вектора переменных). Но я действительно понятия не имею, как к нему подойти. Любые намеки приветствуются!

1 Ответ

2 голосов
/ 19 октября 2019

Вот решение с использованием tidyr и dplyr.
Создайте фрейм данных со столбцами для вкладов игроков. Затем присоедините этот фрейм данных обратно к интересующим столбцам исходного фрейма.

library(tidyr)
library(dplyr)
wide<-pivot_wider(df, id_cols= - player_decision, 
       names_from = player_id, 
       values_from = player_contribution, 
       names_prefix = "player_contribution_")

answer<-left_join(df[, c("group_id",  "player_id", "player_decision") ], wide)

answer

  group_id player_id player_decision player_contribution_1 player_contribution_2 player_contribution_3
1        1         1              10                     6                     5                     4
2        1         2              20                     6                     5                     4
3        1         3              30                     6                     5                     4
4        2         1              40                     3                     2                     1
5        2         2              50                     3                     2                     1
6        2         3              60                     3                     2                     1
...