假设以下数据帧:
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( 第 2 列 - 显示评级在 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,其中计数为 0,即使它应该是 2。
这说明了小尺度,我在大尺度上看到的30k行数据集。我有一个评分从 0 到 4.9 的应用程序列表,因此我的循环中的范围将设置为 0 到 4.9,而不是我示例中的 0.6 到 4.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 数据框设置为基于应用程序和评级组合的初始数据框的分组版本。在 summa 语句中,对于每个可能的组合,我们告诉它计算n()
数并将其除以原始数据框中的行数nrow(DF)
,这将创建新事物的第三行,每对代表的总数的百分比。
它看起来像这样,如果需要,您可以将带有行数的列与另一个 summa 语句一起添加,但要执行此功能,则没有必要。
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))