Приведение нескольких значений в R без удаления строк с повторяющимися идентификаторами, но разными значениями

#r #casting

#r #Кастинг

Вопрос:

Мне нужно привести несколько значений из этого df:

 test_df lt;- data.frame(ID=c("409_012", rep("409_003", 2)),   type=c("a", rep("b", 2)),  val1=sample(1:10, 3),  val2=sample(1:10, 3) )   ID type val1 val2 1 409_012 a 5 9 2 409_003 b 10 2 3 409_003 b 2 3  

Чтобы получить следующий df:

 ID val1_a val2_a val1_b val2_b 1 409_012 5 9 NA NA 2 409_003 NA NA 10 2 3 409_003 NA NA 2 3  

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

 as.data.frame(tidyr::pivot_wider(test_df, names_from=type, values_from=c(val1, val2)))  

И ошибочно дает мне это:

 ID val1_a val1_b val2_a val2_b 1 409_012 5 NULL 9 NULL 2 409_003 NULL 10, 2 NULL 2, 3  

Кто-нибудь может помочь с этим? Если да, то буду очень признателен.

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

1. Добавьте id столбец в свои данные (вы можете использовать tibble::rowid_to_column() его ) перед поворотом.

Ответ №1:

Обновление: Лучше: Использование names_glue

 test_df %gt;%  mutate(id = row_number()) %gt;%   pivot_wider(  names_from = type,  values_from = c(val1, val2),  names_glue = "{.value}_{type}"  ) %gt;%   select(-id)  
 ID val1_a val1_b val2_a val2_b  lt;chrgt; lt;intgt; lt;intgt; lt;intgt; lt;intgt; 1 409_012 5 NA 10 NA 2 409_003 NA 10 NA 7 3 409_003 NA 7 NA 8  

Первый ответ: Одним из способов может быть:

 library(dplyr) library(tidyr)  test_df %gt;%  pivot_longer(  -c(ID, type)  ) %gt;%   unite(names, c(name, type)) %gt;%   pivot_wider(  names_from = names,  values_from = value,  values_fn = list  ) %gt;%   unnest(c(val1_a, val2_a, val1_b, val2_b))  
 ID val1_a val2_a val1_b val2_b  lt;chrgt; lt;intgt; lt;intgt; lt;intgt; lt;intgt; 1 409_012 5 10 NA NA 2 409_003 NA NA 10 7 3 409_003 NA NA 7 8  

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

1. Большое спасибо вам обоим, это именно то, что мне было нужно!