R For 循环扩展范围时的异常



假设以下数据帧:

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))

最新更新