У меня длинный набор данных. Как преобразовать в широкоформатный формат, используя функцию ранга, чтобы ограничить количество создаваемых столбцов? - PullRequest
0 голосов
/ 09 апреля 2019

У меня есть набор данных в длинном формате. Некоторые записи имеют только одного производителя, некоторые записи дублируются, поскольку с каждой записью связано несколько производителей.

Например, у меня есть следующие данные:

id      manufacturer
111     AAA
222     AAA
222     BBB
222     CCC
222     DDD
333     CCC
333     DDD
444     EEE

Используя dplyr, я добавил ранг, чтобы иметь возможность подсчитывать количество производителей.

df %>% 
  select(id, manufacturer) %>% 
  group_by(id) %>% 
  mutate(rank = rank(manufacturer, ties.method = "first"))

Чтобы получить:

id      manufacturer    rank
111     AAA             1
222     AAA             1
222     BBB             2
222     CCC             3
222     DDD             4
333     CCC             1
333     DDD             2
444     EEE             1

Я пробовал dcast, который приближает меня, но я не совсем там.

dcast(df, id ~ rank)

Когда я использую dcast, я получаю:

id     1    2    3    4
111    1    NA   NA   NA
222    1    2    3    4
333    1    2    NA   NA
444    1    NA   NA   NA

Что я пытаюсь получить:

id     manuf_1    manuf_2    manuf_3    manuf_4
111    AAA                                
222    AAA        BBB        CCC        DDD
333    CCC        DDD        
444    EEE                          

1 Ответ

0 голосов
/ 09 апреля 2019

Вам просто нужно установить value.var и изменить rank до нужного формата перед dcast

df %>% 
  dplyr::mutate(rank = paste0('manuf_', rank)) %>% 
  reshape2::dcast(id ~ rank, value.var = 'manufacturer')
#    id manuf_1 manuf_2 manuf_3 manuf_4
# 1 111     AAA    <NA>    <NA>    <NA>
# 2 222     AAA     BBB     CCC     DDD
# 3 333     CCC     DDD    <NA>    <NA>
# 4 444     EEE    <NA>    <NA>    <NA>

использованные данные

df <- data.table::fread('
id      manufacturer    rank
111     AAA             1
222     AAA             1
222     BBB             2
222     CCC             3
222     DDD             4
333     CCC             1
333     DDD             2
444     EEE             1
')
...