在R中使用dplyr:如何使用不同的标准汇总同一列上的数据

时间:2016-11-06 02:36:28

标签: r dplyr

我有这个数据集

Child

我需要使用dplyr来确定具有最佳和最差评级的业务 - 由net_sentiment中的值确定 - 并确定给出最佳和最差评级的用户(使用net_sentiment中的值)以及那个特定的业务ID。

这是我现在所拥有的,

user_id                 business_id             date      stars review_length pos_words neg_words   net_sentiment
Xqd0DzHaiyRqVH3WRG7hzg  vcNAWiLM4dR7D2nwwJ7nCA  17/05/07    5   94              4       1              3
H1kH6QZV7Le4zqTRNxoZow  vcNAWiLM4dR7D2nwwJ7nCA  22/03/10    2   114             3       7             -4
zvJCcrpm2yOZrxKffwGQLA  vcNAWiLM4dR7D2nwwJ7nCA  14/02/12    4   55              6       0              6
KBLW4wJA_fwoWmMhiHRVOA  vcNAWiLM4dR7D2nwwJ7nCA  2/03/12     4   97              0       3              -3
zvJCcrpm2yOZrxKffwGQLA  vcNAWiLM4dR7D2nwwJ7nCA  15/05/12    4   53              1       2             -1


yelp<- read.csv("yelp_ratings.csv")
colnames(yelp)
 [1] "user_id"       "business_id"   "date"          "stars"         "review_length"
 [6] "pos_words"    "neg_words"     "net_sentiment"

这样可以从我的数据集

中打印出来
yelp %>%
  group_by(business_id,user_id) %>%
  summarise(net_sentiment = max(net_sentiment)) %>%
  arrange(desc(net_sentiment)) %>%
  head(n=20)

显示net_sentiment得分最高的商家以及提供net_sentiment得分的用户。

我打算实现的目标是

对于评分最高的企业:

              business_id                user_id net_sentiment
1  -5RN56jH78MV2oquLV_G8g xNb8pFe99ENj8BeMsCBPcQ            80
2  gVYju3XRcO1R4aNk7SZJcA xNb8pFe99ENj8BeMsCBPcQ            78
3  ORiLSAAV4srZ_twFy1tWpw xNb8pFe99ENj8BeMsCBPcQ            77
4  gVYju3XRcO1R4aNk7SZJcA ULOPLvLghKZrfo3PhwbPAQ            74
5  4uGHPY-OpJN08CabtTAvNg xNb8pFe99ENj8BeMsCBPcQ            72

对于评级最差的企业:

            business_id    user_id_best_rating pos_net_sentiment user_id_worst_rating neg_net_sentiment
 -5RN56jH78MV2oquLV_G8g xNb8pFe99ENj8BeMsCBPcQ                80              user123               -50

再次澄清一下,使用dplyr,它应该是首先根据net_sentiment得分确定的最佳企业列表,以及为该企业提供最佳和最差评级的用户,同样应该应用于最差的企业。

1 个答案:

答案 0 :(得分:0)

这是一个可以让你获得第一张桌子的管道;之后,求助将很容易让你获得第二张桌子。如果你每次都拔掉头部,那么就得到你想要的单行输出。

逻辑基本上是按业务分组并将最佳和最差结果变为自己的列,然后您可以将该结果用作userID_best_rating列的键。如果您从该密钥获得的结果太多,则将业务ID作为辅助密钥添加(主要是为每个UserID使用Score-BusiID的复合密钥)。

管道添加ID以获得最高正面和负面评价,然后在将最高评级排序到顶部之前修剪额外内容。

# simplified transportable data demonstrating similar pattern of overlap
busiID <- c('a','b','c','b','e')
userID <- c(1,1,1,2,1)
netSenti <- c(80,78,77,74,72)
ylp <- data.frame(busiID,userID,netSenti)

SmryYlp <- 
    ylp %>% 
    group_by(busiID) %>% 
    mutate(pos_netSenti = max(netSenti), neg_netSenti = min(netSenti)) %>% 
    left_join(select(ylp, neg_netSenti = netSenti, user_id_worst_rating = userID)) %>% 
    left_join(select(ylp, pos_netSenti = netSenti, user_id_best_rating = userID)) %>% 
    select(busiID, user_id_best_rating, pos_netSenti, user_id_worst_rating, neg_netSenti) %>% 
    ungroup %>% distinct %>% 
    arrange(desc(pos_netSenti))

SmryYlp
## A tibble: 4 × 5
#   busiID user_id_best_rating pos_netSenti user_id_worst_rating neg_netSenti
#   <fctr>               <dbl>        <dbl>                <dbl>        <dbl>
# 1      a                   1           80                    1           80
# 2      b                   1           78                    2           74
# 3      c                   1           77                    1           77
# 4      e                   1           72                    1           72

希望这有帮助