Application <- c('A','A','B','B','B','C','C','D')
Rating <- c('0','0.6','0.6','2.0','2.0','3.8','3.8','3.9')
DF <- data.frame(Application,Rating)
DF
#Application Score
#1 A 0
#2 A 0.6
#3 B 0.6
#4 B 2.0
#5 B 2.0
#6 C 3.8
#7 C 3.8
#8 D 3.9
我想创建一个空的结果表,通过循环填充: 第1列 - 显示计算的评级(例如0.6) 第二列 - 显示DF中评级发生的次数 第3栏 - 列出DF中的评级总数(即8) 第4列 - 计算具有该评级的应用程序相对于总体
的比例#create empty results table
results_rating_bins <- as.data.frame(matrix(nrow = 1, ncol = 4))
#initiate row count
rownr = 1
#Loop:
for (rating in seq(from = 0, to = 4.0, by = 0.1)) {
this_rating <- subset(DF, DF$Score == rating)
results_rating_bins[rownr, 1] = rating
results_rating_bins[rownr, 2] = nrow(this_rating)
results_rating_bins[rownr, 3] = nrow(DF)
results_rating_bins[rownr, 4] = nrow(this_rating) / nrow(DF)
rownr <- rownr + 1
}
最终结果是我所期望的,除了评级2.0,即使它应该是2,计数为0。
这在小规模上说明了我用更大规模的30k线数据集看到的东西。我有一个评级从0到4.9的应用程序列表,因此在我的示例中,我的循环中的范围将设置为0到4.9而不是0.6到4.0。但是,当我在大型数据集上运行循环时,我最终会得到一些评级数为0的实例,即使它不应该是。更奇怪的是,通过调整范围,异常(即计数= 0)发生的评级完全随机变化。
知道什么可以证明这种行为的合理性?
大赦
答案 0 :(得分:0)
通常我会按照要求回答问题,尝试解决问题海报已经使用的逻辑。但是,在这种情况下,使用dplyr
聚合到我违反传统的新表中要容易得多。
require(dplyr)
Application <- c('A','A','B','B','B','C','C','D')
Rating <- c('0','0.6','0.6','2.0','2.0','3.8','3.8','3.9')
DF <- data.frame(Application,Rating)
df2<-DF%>%
group_by(Application, Rating)%>%
summarize(ratio=(n()/nrow(DF)))
第一部分与您的相同,但添加了库调用
在它开始df2
的位置,您根据应用程序和评级的组合将df2数据框设置为初始数据框的分组版本。在汇总声明中,对于每个可能的组合,我们告诉它计算数字n()
并将其除以原始数据框nrow(DF)
中的总行数。这将创建新的第三行每对代表的总百分比。
它看起来像这样,如果需要,可以使用另一个汇总语句添加具有行数的列,但是为了执行此功能,没有必要。
Application Rating ratio
1 A 0 0.125
2 A 0.6 0.125
3 B 0.6 0.125
4 B 2.0 0.250
5 C 3.8 0.250
6 D 3.9 0.125
这绝对会捕获应用程序和评级的每个组合,并计算相对于整个数据框的比率。
编辑:如果您不关心申请信,您可以暗示将其从group_by
功能中移除,仍然可以得到您想要的。
并添加
%>%
summarise(rows=nrow(DF))
如果你想要每行的帧中的总行数