我们可以试试data.table。将'data.frame'转换为'data.table'(setDT(df1)),按'Area'分组,我们order'PopularityScore'和前三行的子集(head(.SD,3)),我们创建一个序列列('ind') 按“区域”分组,然后使用 dcast 重塑为宽格式。
library(data.table)#v1.9.6+
DT <- setDT(df1)[order(-PopularityScore), head(.SD,3) ,.(Area)][, ind:= 1:.N, Area]
dcast(DT, Area~ind, value.var=c('RockBand', 'PopularityScore'))
# Area RockBand_1 RockBand_2 RockBand_3 PopularityScore_1
#1: floridaChrist Rocus Metajones U3 87012
#2: sesam FlowerModes Scouting U3 51326
# PopularityScore_2 PopularityScore_3
#1: 43136 17969
#2: 36622 30839
数据
df1 <- data.frame(Area = rep(c('sesam', 'floridaChrist'), c(8,6)),
RockBand= c('FlowerModes', 'Scouting', 'U3', 'MetaJones', 'Rocus',
'Britpi', 'Californi',
'SystemOfDown', 'Rocus', 'Metajones', 'U3',
'FlowerModes', 'Scouting', 'Britpi'), PopularityScore=c(51326, 36622,
30839, 543, 197, 115,70, 3294, 87012, 43136, 17969, 6425, 4383, 3955))