为什么在R中使用sum()无法准确统计≥90分且不含100分的成绩数量
问题原因分析
你遇到的问题核心是 data$test 列的数据类型不是数值型,而是字符型(character)或因子型(factor),具体逻辑如下:
- 做相等判断
== 100时,R会自动将右侧的数值100转换为和左侧列同类型的字符串"100",正好能匹配到值为"100"的行,所以统计结果4是正确的。 - 做大小比较
< 100时,字符型数据会按照字典序进行对比:"90"、"93"、"98"这类90分段的字符串首字符是'9',而"100"的首字符是'1',字典序中'9' > '1',因此所有90分段的字符串都会被判定为大于"100",导致data$test < 100对所有90+非满分的数据都返回FALSE,最终求和结果为0。 - 替换为
!= 100后,判断逻辑又回到了相等性匹配,R仍然会按字符串匹配排除值为"100"的行,此时>=90的字符串比较也能正确匹配到首字符为'9'的90分段数据,因此得到正确结果7。
解决方案
先将test列转换为数值类型再做统计即可,转换代码如下:
# 如果是因子型需要先转字符再转数值,避免直接转成因子的层级编码 data$test <- as.numeric(as.character(data$test))
转换完成后,你最初写的区间统计代码就能正常运行:
sum(data$test < 100 & data$test >= 90, na.rm = T)
内容的提问来源于stack exchange,提问作者CHIA
相关产品推荐
相关产品推荐

