我有这个数据集
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得分确定的最佳企业列表,以及为该企业提供最佳和最差评级的用户,同样应该应用于最差的企业。
答案 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
希望这有帮助