Распределение кадра данных с помощью двух столбцов группировки - PullRequest
0 голосов
/ 11 января 2020

У меня есть набор данных учителей следующим образом:

df <- data.frame(
  teacher = c("A", "A", "A", "A", "B", "B", "C", 'C'),
  seg = c("1", '1', "2", "2", "1", "2", "1", "2"),
  claim = c(
    "beth",
    'john',
    'john',
    'beth',
    'summer',
    'summer',
    "hannah",
    "hannah"
  )
)

В идеале я хотел бы распространить свой набор данных следующим образом:

Желаемый вывод.

enter image description here

Есть какие-нибудь идеи о том, как я могу использовать для этого спред или pivot_wide? Проблема в том, что здесь есть две группирующие переменные (учитель и сегмент). У некоторых учителей может быть несколько одинаковых сегментов, но у некоторых учителей их нет.

Ответы [ 2 ]

1 голос
/ 11 января 2020

Одним из вариантов может быть создание столбца последовательности, сгруппированного по 'teacher', 'seg', и затем использование pivot_wider

library(dplyr)
library(tidyr)
library(stringr)
df %>% 
  group_by(teacher, seg) %>%
  mutate(segN = c("", "double")[row_number()]) %>%
  ungroup %>%
  mutate(seg = str_c("seg", seg, segN)) %>%
  select(-segN) %>%
  pivot_wider(names_from = seg, values_from = claim)
# A tibble: 3 x 5
#  teacher seg1   seg1double seg2   seg2double
#   <fct>   <fct>  <fct>      <fct>  <fct>     
#1 A       beth   john       john   beth      
#2 B       summer <NA>       summer <NA>      
#3 C       hannah <NA>       hannah <NA>    

Это можно упростить с помощью rowid из data.table

library(data.table)
df %>% 
  mutate(seg = str_c('seg', c('', '_double')[rowid(teacher, seg)], seg)) %>%
   pivot_wider(names_from = seg, values_from = claim)
   #or use spread
   # spread(seg, claim)
#  teacher   seg1 seg_double1   seg2 seg_double2
#1       A   beth        john   john        beth
#2       B summer        <NA> summer        <NA>
#3       C hannah        <NA> hannah        <NA>
0 голосов
/ 11 января 2020

Вы также можете использовать базовый способ R с мощной функцией изменения формы и незначительной подготовкой данных

# find duplicate values
dups <- duplicated(df[, 1:2])
# assign new names to duplicates
df[dups, 2] <- paste0(df[dups, 2], "double")

# use base r reshape function that automatically builds suitable names
wide <- reshape(df, v.names = "claim", idvar = "teacher",
                timevar = "seg", direction = "wide", sep = "")

# change varnames to the desired output
names(wide) <- gsub("claim", "seg", names(wide))
wide
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...