R данные от длинных до широких с несколькими выходными столбцами / значениями

#r #dplyr #tidyr #reshape2 #spread

#r #dplyr #tidyr #изменение формы 2 #разброс

Вопрос:

Я пытаюсь понять, как это сформулировать, поэтому я не нахожу хороших результатов с помощью поиска. Пример ввода:

 cust_id  make  part  price  color
1        jeep  wheel 10     gray
1        jeep  door  5      blue
1        jeep  seat  20     brown
2        ford  wheel 12     gray
2        ford  door  8      red
2        ford  seat  25     brown
  

Желаемый результат:

 cust_ID  make  wheel_price  wheel_color  door_price  door_color  seat_price  seat_color
1        jeep  10           gray         5           blue        20          brown
2        ford  12           gray         8           red         25          brown
  

Первоначально использовался spread(), но возникли проблемы со строковыми значениями. Переключился на pivot_wider(), но по-прежнему не может получить несколько выходных столбцов / значений для каждой уникальной части. Заранее спасибо!

Ответ №1:

вы должны использовать pivot_wider:

 library(dplyr)
library(tidyr)

df %>% 
 tidyr::pivot_wider(names_from = part, names_glue = "{part}_{.value}", values_from = c(price, color)) %>%
 dplyr::select(1, 2, sort(current_vars()))

  cust_id make  door_color door_price seat_color seat_price wheel_color wheel_price
    <int> <chr> <chr>           <int> <chr>           <int> <chr>             <int>
1       1 jeep  blue                5 brown              20 gray                 10
2       2 ford  red                 8 brown              25 gray                 12 
  

Комментарии:

1. Спасибо! Я имел в виду pivot_wider, упс. Быстрый — я получаю «аргумент не используется» для names_glue. Есть предложения?

2. @SeanKelso Я полагаю, у вас установлена последняя версия tidyr. Я использовал предоставленные вами данные — если вы используете это для других данных, {part} должно быть тем же именем, что и в «names_from = part» (поэтому, если подразделение берет имена из другого столбца, это также должно быть указано в «names_glue = »