扩展范围时{R 44 For Loop异常

时间:2017-08-02 04:18:40

标签: r loops for-loop

假设以下数据帧:

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)发生的评级完全随机变化。

知道什么可以证明这种行为的合理性?

大赦

1 个答案:

答案 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))
如果你想要每行的帧中的总行数