Длинный к широкому с неуникальными комбинациями клавиш в R - PullRequest
1 голос
/ 24 октября 2019

Я пытаюсь преобразовать набор данных из длинного в широкий формат. Нужно сделать это для подачи в другую программу для целей анализа. Мои входные данные ниже:

sdata <- data.frame(c(1,1,1,1,1,1,1,1,1,1,1,1,1),c(1,1,1,1,1,1,1,1,1,2,2,2,2),c("X1","A","B","C","D","X2","A","B","C","X1","A","B","C"),c(81,31,40,5,5,100,8,90,2,50,20,24,6))
col_headings <- c("Orig","Dest","Desc","Estimate")
names(sdata) <- col_headings

Входные данные

input data

В зависимости от уникальной комбинацииOrig-Dest-X1, категория Orig-Dest-X2 выше, подкатегории различаются только от A, B, C до A, B, C, D до A, B и т. Д. Я пытаюсь получить желаемый результат (код длявоссоздать в R ниже) вместе с изображением желаемого выхода.

sdata_spread <- data.frame(c(1,1),c(1,2),c(81,50),c(31,20),c(40,24),c(5,6),c(5,NA),c(100,NA),c(8,NA),c(90,NA),c(2,NA))
col_headings <- c("Orig","Dest","X1",   "X1_A", "X1_B", "X1_C", "X1_D","X2",    "X2_A", "X2_B", "X2_C")
names(sdata_spread) <- col_headings

Требуемый выход

enter image description here

Я попробовал следующее:

sdata_spread <- sdata %>% spread(Desc,Estimate)

Ошибка, которую я получил, была:

Error: Each row of output must be identified by a unique combination of keys.
Keys are shared for 6 rows

Я также попробовал принятый ответ, приведенный здесь: Длинный к ширине без уникального ключа и здесь: Длинный к широкому формату снесколько дубликатов. Обход с уникальным списком столбцов , но он не дал мне желаемого результата.

Любое понимание будет высоко ценится.

Спасибо, Кришнан

1 Ответ

1 голос
/ 24 октября 2019

Один из вариантов - создать переменную группировки на основе вхождения «X» в качестве первого символа в «Desc», используйте его для изменения «Desc» с помощью paste с помощью элемента first в «Desc». 'с каждым элементом на основе условия в case_when и преобразованием в широкоформатный формат с pivot_wider (из tidyr_1.0.0, spread/gather устаревают и вместо него используются pivot_wider/pivot_longer)

library(dplyr)
library(tidyr)
library(stringr)
sdata %>%
  group_by(grp = cumsum(str_detect(Desc, '^X'))) %>% 
  mutate(Desc = case_when(row_number() > 1 ~ str_c(first(Desc), Desc, sep="_"),
            TRUE ~ as.character(Desc))) %>%
  ungroup %>% 
  select(-grp) %>% 
  pivot_wider(names_from = Desc, values_from = Estimate)
# A tibble: 2 x 11
#   Orig  Dest    X1  X1_A  X1_B  X1_C  X1_D    X2  X2_A  X2_B  X2_C
#  <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#1     1     1    81    31    40     5     5   100     8    90     2
#2     1     2    50    20    24     6    NA    NA    NA    NA    NA
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...