Превращение данных от длинных до широких с повторяющимися значениями - PullRequest
1 голос
/ 01 октября 2019
  fill       W   id       X        T
    1       403 29730    100      111
    1      8395 10766    100       92
    1      4170 14291    100       98
    1      2768 20506    200      110
    1      3581 15603    100      112
    6         1 10504    200       87
    9       48  29730    100       89
    1     4790  10766    200       80

Это немного измененная случайная выборка из моих фактических данных. Я хотел бы:

 id       X        T   403 8395 ....
 29730    100      111   1
 10766    100       92       1  
 14291    100       98
 20506    200      110
 15603    100      112
 10504    200       87
 29730    100       89
 10766    200       80

ID уведомления 29730 и в T 89, и в 111. Я думаю, что это должно быть просто reshape2::dcast, однако

data_wide <- reshape2::dcast(data_long, id + T + X ~ W, value.var = "fill") дает нелогичный результат. Существует ли вообще один и тот же идентификатор для T1 и T2 во время приведения кадра данных?

1 Ответ

0 голосов
/ 08 октября 2019

Если я правильно понимаю, это , а не тривиальный изменение формы от длинного к широкому вопрос с учетом требований OP:

  1. Порядок строк должен поддерживаться.
  2. Столбцы должны быть упорядочены в виде W.
  3. Пропущенные записи должны отображаться пустыми, а не NA.

Для этого требуется

  • для добавления номера строки для включения в формулу изменения формы,
  • для превращения W в фактор, в котором уровни факторов упорядочены по внешнему виду с использованием forecats::fct_inorder(), например,
  • для использования функции агрегирования, которая превращает NA в "" с использованием toString(), например,
  • , и для удаления номеров строк из измененного результата.

Здесь data.table реализация dcast() используется, так как data.table выглядит немного более удобным, ИМХО.

library(data.table)
dcast(setDT(data_long)[, rn := .I], rn + id + T + X  ~ forcats::fct_inorder(factor(W)), 
      toString, value.var = "fill")[
        , rn := NULL][]
      id   T   X 403 8395 4170 2768 3581 1 48 4790
1: 29730 111 100   1                              
2: 10766  92 100        1                         
3: 14291  98 100             1                    
4: 20506 110 200                  1               
5: 15603 112 100                       1          
6: 10504  87 200                         6        
7: 29730  89 100                            9     
8: 10766  80 200                                 1

Данные

library(data.table)
data_long <- fread("  fill       W   id       X        T
    1       403 29730    100      111
    1      8395 10766    100       92
    1      4170 14291    100       98
    1      2768 20506    200      110
    1      3581 15603    100      112
    6         1 10504    200       87
    9       48  29730    100       89
    1     4790  10766    200       80")
...