我有一个很长的数据集。如何在使用排名函数限制创建的列数时转换为宽格式?

I have a long data set. How do I convert to wide format while using a rank function to limit the number of columns created?

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

比如我有以下数据:

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                          

您只需设置 value.var,并在 dcast

之前将 rank 更改为您想要的格式
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
')