2016-11-26 77 views
1

所以我有這個數據集,其中包含有多少人已經給出了一系列產品的特定評級,即每個評級(1-5)有一列,每行包含計數。如何計算每個產品的平均評分?

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 

有誰知道我怎麼能找到中位數評分?

+0

取決於中位數的定義。單座選舉系統的中位數是多少?做網絡研究,有例子。 – Swift

+0

你是什麼意思,例如最後一行: 玩具的平均中位數(c(rep(5,628),rep(4,1),rep(3,1),rep(2,1),rep(1 ,2)))= 5? – OmaymaS

回答

0

解決方案

主要依靠dplyr

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) 

結果

 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 

我用下面的代碼來生成df。在將來,我建議包括這樣的內容,以方便用戶重現。

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

這一切都取決於ID是什麼值的列意味着什麼,你如何定義中位數。我做如下假設:

  • ID是產品ID
  • ..._count_i意味着等級值i
  • 「中間」是指計數列所有收視率的總和除以加權總和該產品

然後你得到了 「平均」 的:

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

謝謝對不起,我可以更清楚,但當我說中位數時,我的意思是中間值,例如如果我有一行產品ID 7,我會有628 5,1 4等,我想在這一行中找到中間值。 –

+0

好吧,那麼我的解決方案應該是一個合理的方式來計算你的名字「中位數」。,,,, – phynfo

0

你可以做這樣的事情來獲得列索引的每一行

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

如何將數據幀轉換爲矩陣(如果尚未矩陣),然後使用rep()times參數應用加權中位數。

讓我們把自己的原始數據df

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

我認爲,讓您所需的輸出。

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