Почему dcast дает 1 и 0? - PullRequest
       29

Почему dcast дает 1 и 0?

0 голосов
/ 24 февраля 2020

У меня есть следующий фрейм данных

FileNumber<-c("510708396","510708396","510708396","510708485","510667325")
EventCode<-c("CASCRT","DISCSENT","DISCSENT","CASCRT","DISCSENT")
EventDate<-c("8/21/2018 12:00:00 AM","12/3/2018 2:41:18 PM","12/3/2018 3:50:16 PM","8/23/2018 12:00:00 AM","12/12/2018 9:11:28 AM")

df<-data.frame(FileNumber,EventCode,EventDate)
  FileNumber EventCode             EventDate
1  510708396    CASCRT 8/21/2018 12:00:00 AM
2  510708396  DISCSENT  12/3/2018 2:41:18 PM
3  510708396  DISCSENT  12/3/2018 3:50:16 PM
4  510708485    CASCRT 8/23/2018 12:00:00 AM
5  510667325  DISCSENT 12/12/2018 9:11:28 AM

Я хочу изменить этот фрейм данных длинного формата на широкоформатные данные с использованием EventCodes CASRT и DISCSENT в качестве имен столбцов. Я попробовал следующее

library(reshape2)
dcast(df,FileNumber~EventCode,value.var = "EventDate")

, однако получаю следующее и сообщение, что "Функция агрегации отсутствует: по умолчанию длина" , где, как я ожидал, значения EventDate.

  FileNumber CASCRT DISCSENT
1  510667325      0        1
2  510708396      1        2
3  510708485      1        0

Я предполагаю, что это как-то связано с неуникальными значениями в FileNumber. Как мне убедиться, что я получаю значения даты события вместо 1 и 0.

1 Ответ

0 голосов
/ 24 февраля 2020

Вы получаете эту ошибку, потому что есть несколько строк с одинаковыми EventNumber и EventCode. При попытке преобразовать данные в широкоформатный формат reshape не знает, как обрабатывать несколько значений, и использует его запасное решение, равное lenght (т. Е. Считая, сколько элементов содержится в этой ячейке)

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

Вы можете преобразовать столбец EventDate в формат даты и времени, чтобы можно было вычислить среднее значение. Или используйте только max или min.

Если вы хотите сохранить каждую дату в списке, я настоятельно рекомендую использовать функцию tidyr s pivot_wider:

FileNumber<-c("510708396","510708396","510708396","510708485","510667325")
EventCode<-c("CASCRT","DISCSENT","DISCSENT","CASCRT","DISCSENT")
EventDate<-c("8/21/2018 12:00:00 AM","12/3/2018 2:41:18 PM","12/3/2018 3:50:16 PM","8/23/2018 12:00:00 AM","12/12/2018 9:11:28 AM")

df<-data.frame(FileNumber,EventCode,EventDate)

library(dplyr)
library(tidyr)

df2 <- df %>%
  pivot_wider(names_from = EventCode,
              values_from = EventDate)

Это вызывает предупреждение, но помещает несколько элементов в список:

df2 теперь:

# A tibble: 3 x 3
  FileNumber      CASCRT    DISCSENT
  <fct>      <list<fct>> <list<fct>>
1 510708396          [1]         [2]
2 510708485          [1]         [0]
3 510667325          [0]         [1]

И мы можем получить доступ к элементам в списке:

df2$DISCSENT[1]

Возвращает:

list_of<factor<b7763>>[1]>
[[1]]
[1] 12/3/2018 2:41:18 PM 12/3/2018 3:50:16 PM
5 Levels: 12/12/2018 9:11:28 AM ... 8/23/2018 12:00:00 AM
...