我有一个很长的数据集。如何在使用排名函数限制创建的列数时转换为宽格式?
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
')
我有一个长格式的数据集。有些记录只有一个制造商,有些记录是重复的,因为有多个制造商与每个记录相关联。
比如我有以下数据:
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
')