【发布时间】: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"))?