2016-11-26 3 views
1

Also habe ich diesen Datensatz, der eine Zählung enthält, wie viele Leute bestimmte Bewertungen für eine Reihe von Produkten gegeben haben, d. H. Es gibt eine Spalte für jede Bewertung (1-5) und jede Zeile enthält die Anzahl.Wie kann ich die Median-Bewertung für jedes Produkt finden, wenn die Anzahl an gegeben ist?

ID ratings_count_5 ratings_count_4 ratings_count_3 ratings_count_2 ratings_count_1 
    2    599    624    78    357    4 
    3    350    407    95    382    255 
    4    454    368    52    245    512 
    5    729    938    520    145    478 
    6    548    176    431    313    459 
    7    628    1    1    1    2 

Weiß jemand, wie ich die mittlere Bewertung finden konnte?

+0

hängt von der Definition der Medianbewertung ab. Ist das Median Rating von Single-Sitz-Wahl-System? Web Research gibt es Beispiele. – Swift

+0

Was meinst du genau, zum Beispiel die letzte Reihe: Mach das Spielzeug meinen Median (c (rep (5,628), rep (4,1), rep (3,1), rep (2,1), rep (1 , 2))) = 5? – OmaymaS

Antwort

0

Lösung

stark auf dplyr Unter Berufung:

library(dplyr) 
library(tidyr) 
df %>% 
    gather(rating, freq, -ID) %>% 
    arrange(rating) %>% 
    group_by(ID) %>% 
    mutate(cum_dist = cumsum(freq)/sum(freq), 
      past_half = cum_dist >= 0.5) %>% 
    filter(past_half) %>% 
    top_n(-1, cum_dist) %>% 
    select(ID, rating) %>% 
    arrange(ID) 

Ergebnis

 ID   rating 
    <dbl>   <chr> 
1  2 ratings_count_4 
2  3 ratings_count_4 
3  4 ratings_count_4 
4  5 ratings_count_4 
5  6 ratings_count_3 
6  7 ratings_count_5 

Hinweis

Ich habe den folgenden Code verwendet, um die df zu generieren. In der Zukunft schlage ich vor, etwas wie diese einzufügen, um es dem Benutzer zu erleichtern, es zu reproduzieren.

df <- data.frame(
    ID = c(2, 3, 4, 5, 6, 7), 
    ratings_count_5 = c(599, 350, 454, 729, 548, 628), 
    ratings_count_4 = c(624, 407, 368, 938, 176, 1), 
    ratings_count_3 = c(78, 95, 52, 520, 431, 1), 
    ratings_count_2 = c(357, 382, 245, 145, 313, 1), 
    ratings_count_1 = c(4, 255, 512, 478, 459, 2)) 
2

Dies hängt davon ab, was ID ist, was die Werte in den Spalten bedeuten und wie Sie den Median definieren. Ich mache die folgenden Annahmen:

  • ID ist die Produkt-ID
  • ..._count_i eine Bewertung von Wert bedeutet i
  • „Median“ bedeutet die gewichtete Summe der Count-Spalten durch die Summe aller Bewertungen geteilt für das Produkt

Dann erhalten Sie den "Median" von:

df$sum = apply(df, 1, sum) 
df$median = (df$ratings_count_5 * 5 + df$ratings_count_4 * 4 + 
       df$ratings_count_3 * 3 + ratings_count_2 * 2 + 
       df$ratings_count_1 * 1)/df$sum 
+0

Danke Entschuldigung, ich hätte klarer sein können, aber wenn ich Median sage, meine ich den Medianwert, z. Wenn ich eine Zeile mit der Produkt-ID 7 hätte, hätte ich 628 5, 1 4, usw., und ich möchte den mittleren Wert in dieser Zeile finden. –

+0

Ok, dann sollte meine Lösung eine vernünftige Art sein, zu berechnen, was du "Median" nennst. ,,, – phynfo

0

Sie können so etwas wie dies tun, um den Spaltenindex für jede Zeile

ID <- c(2,3) 
ratings_count_5 <- c(599,350) 
ratings_count_4 <- c(624,407) 
ratings_count_3 <- c(78,95) 
ratings_count_2 <- c(357,382) 
ratings_count_1 <- c(4,255) 

df <- data.frame(ID,ratings_count_5,ratings_count_4,ratings_count_3,ratings_count_2,ratings_count_1) 

df$median <- median(unname(unlist(df[,-1]))) 
r <- df[,2:6]-df[,7] 
index <- data.frame(NULL) 

for(i in 1:nrow(r)){ 
    ind <- which.min(unlist(abs(r[i,]))) 
    index <- rbind(index,ind) 
} 

df <- cbind(df,index) 
setnames(df,"X4L","col_index") 
df 
1

Wie zum Konvertieren von Datenrahmen an eine Matrix (falls nicht bereits eine Matrix) und dann die Anwendung gewichten Mittelwert mit dem times Argumente von rep() zu bekommen.

Lassen Sie uns df Ihre ursprünglichen Daten nennen:

mat <- as.matrix(df[, -1]) 
median_rating <- apply(mat, 1, function(x) median(rep(5:1, times=x))) 
cbind(df, median_rating) 

Ich denke, dass Sie die gewünschte Ausgabe gibt.

ID ratings_count_5 ratings_count_4 ratings_count_3 ratings_count_2 ratings_count_1 median_rating 
1 2    599    624    78    357    4    4 
2 3    350    407    95    382    255    4 
3 4    454    368    52    245    512    4 
4 5    729    938    520    145    478    4 
5 6    548    176    431    313    459    3 
6 7    628    1    1    1    2    5 
Verwandte Themen