2016-11-06 3 views
0

ich diese Datenin R Verwendung dplyr: Wie werden Daten auf derselben Spalte mit unterschiedlichen Kriterien zusammenfassen

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" 

Ich brauche dplyr zu verwenden gesetzt haben, die Unternehmen zu bestimmen, die die besten und schlechtesten Rating bewertet --- bestimmen durch den Wert in net_sentiment --- und bestimmen Sie auch die Benutzer, die die beste und schlechteste Bewertungen (mit dem Wert in net_sentiment als auch) für diese bestimmte Business-ID angegeben.

Heres, was ich jetzt habe,

yelp %>% 
    group_by(business_id,user_id) %>% 
    summarise(net_sentiment = max(net_sentiment)) %>% 
    arrange(desc(net_sentiment)) %>% 
    head(n=20) 

Diese aus einem Druck gibt, aus meiner Datensatz

   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 

die das Geschäft mit dem höchsten net_sentiment Punktzahl zeigt und auch den Benutzer, gab diesen Net_sentiment-Score.

Was ich erreichen wollen ist so etwas wie

Für das Geschäft mit Bestnote:

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

Für das Geschäft mit schlechteste Bewertung:

business_id user_id_best_rating pos_net_sentiment user_id_worst_rating neg_net_sentiment 
business123    user345    10    user789     -150 

Wieder zu klären, dplyr mit Es sollte eine Auflistung der besten Unternehmen zuerst durch die Net_sentiment Punktzahl und die Benutzer, die die beste und schlechteste Bewertung für dieses Geschäft und das gleiche sollte App sein bestimmt werden belogen zu den schlimmsten Geschäften.

+2

Einige Beispieldaten machen würde es wesentlich einfacher Gedanken und/oder Antworten. Ein Gedanke ist jedoch, dass es einfacher ist, zu erwarten, dass Ihre Ergebnisse im "großen" Format bleiben, indem Sie auf das von Ihnen vorgeschlagene "breite" Format umschalten. Obwohl es nicht schwer zu konvertieren ist, ist es viel einfacher, das große Format zu visualisieren und zu produzieren. – r2evans

+0

@ r2evans fügte einige Beispieldaten hinzu. –

+0

Möchten Sie Ihre Beziehungen unterbrechen oder möchten Sie alle Ergebnisse für die höchste und niedrigste Punktzahl zurückbekommen? –

Antwort

0

Hier ist ein einzelnes Rohr, das Ihnen die erste Tabelle bringen kann; danach, Resorting wird Ihnen die zweite Tabelle sehr leicht. Wenn Sie jedes Mal den Kopf abziehen, erhalten Sie Ihre einzige Zeile der gewünschten Ausgabe.

Die Logik besteht im Grunde darin, nach Geschäft zu gruppieren und die besten und schlechtesten Ergebnisse in ihre eigenen Spalten zu mutieren, dann können Sie dieses Ergebnis als Schlüssel für eine Spalte der userID_best_rating verwenden. Wenn Sie zu viele Ergebnisse von diesem Schlüssel erhalten, fügen Sie die Geschäfts-ID als sekundären Schlüssel hinzu (im Wesentlichen verwenden Sie für jede Benutzer-ID einen zusammengesetzten Schlüssel von Score-BusiID).

Das Rohr fügt IDs für die meisten positiven und negativen Bewertungen hinzu und schneidet dann die Extras ab, bevor die höchste Bewertung nach oben sortiert wird.

# 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 

this helps

Verwandte Themen