Переход от фрейма данных к уникальной переменной и нескольким столбцам - PullRequest
1 голос
/ 05 мая 2020

Я хочу повернуть этот фрейм данных:

       Ticket          Final_Phase               Datestamp
1    C1550135   IMAC F1 Aprobacion 2019-04-01 12:00:58.000
2    C1550135 IMAC F1 Alistamiento 2019-09-18 17:25:56.000
3    C1550135 IMAC F1 Programacion 2019-09-18 17:54:02.000
4    C1550135    IMAC F1 Ejecucion 2019-09-18 17:54:41.000
5    C1550135   IMAC F1 Validacion 2019-09-18 18:15:34.000
6    C1550135       IMAC F1 Cierre 2019-09-20 16:18:26.000

в это:

    Ticket      IMAC.F1.Aprobacion    IMAC.F1.Alistamiento    IMAC.F1.Programacion       IMAC.F1.Ejecucion      IMAC.F1.Validacion
1 C1550135 2019-04-01 12:00:58.000 2019-04-01 12:00:58.000 2019-04-01 12:00:58.000 2019-04-01 12:00:58.000 2019-04-01 12:00:58.000
2 C1564390 2019-04-01 12:00:58.000 2019-04-01 12:00:58.000 2019-04-01 12:00:58.000 2019-04-01 12:00:58.000 2019-04-01 12:00:58.000

, поэтому я попробовал:

Dset_Pivot <- Dset %>%
  mutate(row = row_number()) %>%
  group_by(Ticket) %>%
  pivot_wider(names_from = "Final_Phase", values_from = "Datestamp") %>%
  select(-row)

и получил следующий результат:

    Ticket   IMAC F1 Aprobaci~ IMAC F1 Alistami~  IMAC F1 Programa~  IMAC F1 Ejecucio~  IMAC F1 Validaci~ 
1 C1550135 2019-04-01 12:00:~ NA                 NA                 NA                 NA                   
2 C1550135 NA                 2019-09-18 17:25:~ NA                 NA                 NA                   
3 C1550135 NA                 NA                 2019-09-18 17:54:~ NA                 NA                   
4 C1550135 NA                 NA                 NA                 NA                 NA                   
5 C1550135 NA                 NA                 NA                 NA                 NA                   
6 C1550135 NA                 NA                 NA                 NA                 2019-09-20 16:18:~

Что отлично работает, но я не могу сгруппировать df в уникальные значения Ticket и значения, отличные от NA для каждого столбца.

Я хотел бы знать, есть ли более простой способ группировки и поверните фрейм данных непосредственно к желаемому результату или, если мне не хватает дополнительного шага (в случае, если это оптимальный способ)

Ответы [ 2 ]

1 голос
/ 05 мая 2020

Я знаю, что вы используете dplyr, но это было бы очень просто сделать с data.table.

library(data.table)
setDT(Dset)
Dset_Pivot <- dcast(Dset, Ticket ~ Final_Phase, value.var="Datestamp")

EDIT:

Для дубликатов один вариант было бы сгенерировать идентификатор для повторяющихся записей:

DT[, ID := 1:.N, keyby=list(Ticket, Final_Phase)]

Затем попробуйте

Dset_Pivot <- dcast(Dset, Ticket + ID ~ Final_Phase, value.var="Datestamp")
1 голос
/ 05 мая 2020

Проблема в созданном столбце последовательности. Он создается как row_number() без какой-либо группировки, т.е. если есть 1 миллион строк, последовательность будет 1-1e6, и когда у нас есть последовательность столбцов с этим индексом, очевидно, что pivot_wider также имеет тот же номер рядов. Вместо этого нам нужна последовательность group_by

library(dplyr)
library(tidyr)
Dset %>% 
   group_by(Ticket, Final_Phase) %>%
   mutate(row = row_number())  %>% 
   ungroup %>%
   pivot_wider(names_from = "Final_Phase", values_from = "Datestamp") %>%
   select(-row)
# A tibble: 1 x 7
#  Ticket  `IMAC F1 Aprobaci… `IMAC F1 Alistami… `IMAC F1 Programa… `IMAC F1 Ejecuci… `IMAC F1 Validac… `IMAC F1 Cierre` 
#  <chr>   <chr>              <chr>              <chr>              <chr>             <chr>             <chr>            
#1 C15501… 2019-04-01 12:00:… 2019-09-18 17:25:… 2019-09-18 17:54:… 2019-09-18 17:54… 2019-09-18 18:15… 2019-09-20 16:1

Кроме того, как @ Dave2e упомянул в комментариях, на основе примера значения Final_Phase равны unique для каждого билета. В этом случае создание последовательности и последующее удаление не требуется, т.е.

Dset %>%
     pivot_wider(names_from = "Final_Phase", values_from = "Datestamp") 

данные

Dset <- structure(list(Ticket = c("C1550135", "C1550135", "C1550135", 
"C1550135", "C1550135", "C1550135"), Final_Phase = c("IMAC F1 Aprobacion", 
"IMAC F1 Alistamiento", "IMAC F1 Programacion", "IMAC F1 Ejecucion", 
"IMAC F1 Validacion", "IMAC F1 Cierre"), Datestamp = c("2019-04-01 12:00:58.000", 
"2019-09-18 17:25:56.000", "2019-09-18 17:54:02.000", "2019-09-18 17:54:41.000", 
"2019-09-18 18:15:34.000", "2019-09-20 16:18:26.000")), 
class = "data.frame", row.names = c("1", 
"2", "3", "4", "5", "6"))
...