Преобразование длины в ширину с несколькими строками с одинаковым значением в R

#r

#r

Вопрос:

Я пытаюсь преобразовать эти данные из длинных в широкие, но получаю ошибки. Я считаю, что это связано с тем, что мои переменные id/времени не все уникальны (см., Как для идентификатора 98 есть 2 «синих» наблюдения). Я хочу просто добавить 2, 3 и т. Д. для них, как в примере вывода ниже.

 ID color. height weight. BMI 45. red. 15 100. 19 33. blue. 19 130. 17 33. green. 25 120. 28 67. red. 19. 134. 31 98. blue. 26. 112. 19 98. blue. 12. 116. 26 98. red. 14. 88. 25      
  ID. red_height red_weight red_BMI blue_height blue_weight blue_BMI blue2_height blue2_weight blue2_BMI green_height green_weight green_BMI  45 15 100 19 NA NA NA NA NA NA NA NA NA 33. NA NA NA 19 130 17 NA NA NA 25 120 28  67 19. 134. 31 NA NA NA NA NA NA NA NA NA  98. 14. 88. 25. 26 112 19 12 116 26. NA NA NA      

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

1. Было бы полезно, если бы вы могли опубликовать код для своих данных и код того, что вы пробовали. Попробуйте dput вывести структуру ваших данных

Ответ №1:

Мы можем создать последовательность по группам, а затем использовать pivot_wider

 library(dplyr) library(stringr) df1 %gt;%  group_by(ID, color) %gt;%   mutate(color = case_when(row_number() gt; 1 ~   str_c(color, row_number()), TRUE ~ color)) %gt;%   ungroup %gt;%   pivot_wider(names_from = color, values_from = c(height, weight, BMI))  

-выход

 # A tibble: 4 × 13  ID height_red height_blue height_green height_blue2 weight_red weight_blue weight_green weight_blue2 BMI_red BMI_blue BMI_green BMI_blue2  lt;dblgt; lt;dblgt; lt;dblgt; lt;dblgt; lt;dblgt; lt;dblgt; lt;dblgt; lt;dblgt; lt;dblgt; lt;intgt; lt;intgt; lt;intgt; lt;intgt; 1 45 15 NA NA NA 100 NA NA NA 19 NA NA NA 2 33 NA 19 25 NA NA 130 120 NA NA 17 28 NA 3 67 19 NA NA NA 134 NA NA NA 31 NA NA NA 4 98 14 26 NA 12 88 112 NA 116 25 19 NA 26  

данные

 df1 lt;- structure(list(ID = c(45, 33, 33, 67, 98, 98, 98), color = c("red",  "blue", "green", "red", "blue", "blue", "red"), height = c(15,  19, 25, 19, 26, 12, 14), weight = c(100, 130, 120, 134, 112,  116, 88), BMI = c(19L, 17L, 28L, 31L, 19L, 26L, 25L)),  class = "data.frame", row.names = c(NA,  -7L))  

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

1. Когда я запускаю это, он создает дополнительные столбцы, однако он также сохраняет все строки (все еще есть 3 строки с идентификатором 98).

2. @alex Я показал воспроизводимый пример с данными в своем посте

3. @alex Я предполагаю, что это может быть проблемой с версией пакета, которая у вас есть

4. @alex попробуйте изменить название столбца на «цвет» df1 %gt;% group_by(ID, color) %gt;% mutate(color2 = case_when(row_number() gt; 1 ~ str_c(color, row_number()), TRUE ~ color)) %gt;% ungroup %gt;% select(-color) %gt;% pivot_wider(names_from = color2, values_from = c(height, weight, BMI))