R 我如何才能找到每个产品的中位数评分,考虑到整个产品的计数?
因此,我有一个数据集,其中包含有多少人对一系列产品给出了特定的评级,也就是说,每个评级(1-5)有一列,每行包含计数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
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
是什么,列中的值是什么意思,以及如何定义中值。我作出以下假设:
是产品IDID
表示值i的评级…\u count\u 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))