#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. Большое спасибо вам обоим, это именно то, что мне было нужно!