R 如何从现有数据中形成一个新的数据框架,每个类别具有前3个值

R 如何从现有数据中形成一个新的数据框架,每个类别具有前3个值,r,R,假设我有一个如下的数据 PRODUCT SUPERMARKET PRICE Bean Adonis 87 Bean Rodunia 66 Bean Chausia 43 Bean Emynia 43 Butter Ranucia 74 Butter Adonis 60 Coca-Cola Emynia 84 Coca-Cola

假设我有一个如下的数据

PRODUCT SUPERMARKET     PRICE
Bean        Adonis       87
Bean        Rodunia      66
Bean        Chausia      43
Bean        Emynia       43
Butter      Ranucia      74
Butter      Adonis       60
Coca-Cola   Emynia       84
Coca-Cola   Chausia      61
Coca-Cola   Serisia      35
我需要以下表格中的数据

PRODUCT SUPERMARKET 1     SUPERMARKET 2 SUPERMARKET 3
Bean        Adonis         Rodunia         Chausia
Butter      Ranucia        Adonis           NA
Coca-Cola   Emynia         Chausia         Serisia

原始数据的大小很大,因此使用for循环会带来性能问题。有人能帮忙吗

我们可以用
tidyverse
来做这件事

library(tidyverse)
df1 %>%
     group_by(PRODUCT) %>%
     top_n(3, wt = PRICE) %>%
     mutate(val = paste0("SUPERMARKET_", row_number())) %>% 
     filter(row_number()<=3) %>% 
     select(-PRICE) %>% 
     spread(val, SUPERMARKET)
# A tibble: 3 × 4
# Groups: PRODUCT [3]
#    PRODUCT SUPERMARKET_1 SUPERMARKET_2 SUPERMARKET_3
#*     <chr>         <chr>         <chr>         <chr>
#1      Bean        Adonis       Rodunia       Chausia
#2    Butter       Ranucia        Adonis          <NA>
#3 Coca-Cola        Emynia       Chausia       Serisia
库(tidyverse)
df1%>%
组别(产品)%>%
顶部(3,重量=价格)%>%
变异(val=paste0(“超市”,行号())%>%
过滤器(行号()%
选择(-PRICE)%>%
摊铺(val、超市)
#一个tibble:3×4
#组别:产品[3]
#产品超市1超市2超市3
#*                                
#1豆荚
#2黄油拉努西亚阿多尼斯
#3可口可乐公司
数据
df1因为这只是样本数据,所以为原始数据创建df1会很麻烦task@aman在这里,我使用了
dput
来获取结构。这只是您的示例数据
df1 <- structure(list(PRODUCT = c("Bean", "Bean", "Bean", "Bean", "Butter", 
"Butter", "Coca-Cola", "Coca-Cola", "Coca-Cola"), SUPERMARKET = c("Adonis", 
"Rodunia", "Chausia", "Emynia", "Ranucia", "Adonis", "Emynia", 
"Chausia", "Serisia"), PRICE = c(87L, 66L, 43L, 43L, 74L, 60L, 
84L, 61L, 35L)), .Names = c("PRODUCT", "SUPERMARKET", "PRICE"
), class = "data.frame", row.names = c(NA, -9L))