R 我如何才能找到每个产品的中位数评分,考虑到整个产品的计数?

R 我如何才能找到每个产品的中位数评分,考虑到整个产品的计数?,r,R,因此,我有一个数据集,其中包含有多少人对一系列产品给出了特定的评级,也就是说,每个评级(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

因此,我有一个数据集,其中包含有多少人对一系列产品给出了特定的评级,也就是说,每个评级(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

有人知道我怎样才能找到中位数吗

这一切都取决于
ID
是什么,列中的值是什么意思,以及如何定义中值。我作出以下假设:

  • ID
    是产品ID
  • …\u count\u i
    表示值i的评级
  • “中位数”是指计数列的加权和除以该产品的所有评级之和
然后通过以下方式获得“中值”:


您可以这样做来获取每行的列索引

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

ID如何将数据帧转换为矩阵(如果还不是矩阵),然后使用
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)

解决方案

严重依赖于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

取决于评级中值的定义。这是单议席选举制度的中位数吗?做网络调查,有一些例子。你的确切意思是什么,例如最后一行:toy是指中值(c(代表5628),代表4,1,代表3,1,代表2,1),代表1,2))=5?谢谢,对不起,我本来可以更清楚,但当我说中值时,我指的是中值,例如,如果我有一行产品ID 7,我会有628个5,14个,等等,我想找到这行的中间值。好的,那么我的解决方案应该是一个合理的方法来计算你所说的“中值”。,,,
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 <- 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))