我的数据集很长。在使用等级函数限制创建的列数时,如何转换为宽格式?

时间:2019-04-09 18:25:35

标签: r dplyr reshape2 dcast

我有一个长格式的数据集。有些记录只有一个制造商,有些记录是重复的,因为每个记录有多个制造商。

例如,我有以下数据:

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 :(得分:0)

您只需要设置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
')