【问题标题】:R For Loop anomaly when expanding the range扩大范围时R For Loop异常
【发布时间】:2017-08-02 04:18:40
【问题描述】:

假设以下数据框:

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

我想创建一个空结果表以通过循环填充: 第一列 - 显示正在计算的评级(例如 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)的评级完全随机变化。

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

特赦

【问题讨论】:

  • R FAQ 7.31?编辑:忽略,你在做character 数字比较。
  • 虽然不是 7.31,但它仍然是相关的......因为您正在将一个数字(介于 0 和 4.0 之间)与 character 进行比较,所以该数字被向上转换为一个字符。猜猜as.character(2.0) 转换成什么? (提示:不是"2.0"。)也许你更喜欢使用for (rating in format(seq(...), format="%0.1f"))

标签: r loops for-loop


【解决方案1】:

通常我会按照提问的方式回答问题,并尝试通过问题发布者已经使用的逻辑来解决问题。但是,在这种情况下,使用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

这绝对会捕获 Application 和 Rating 的每个组合,并计算相对于整个数据框的比率。

编辑:如果您不关心申请信,您可以暗示将其从group_by 函数中删除,仍然可以获得您想要的。

并添加
%&gt;%
summarise(rows=nrow(DF))
如果你想要每行框架中的总行数

【讨论】:

    猜你喜欢
    • 2015-11-23
    • 1970-01-01
    • 1970-01-01
    • 2014-09-21
    • 1970-01-01
    • 1970-01-01
    • 2013-09-28
    • 2021-04-13
    • 1970-01-01
    相关资源
    最近更新 更多