You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R读取CSV生成Dataframe后数值列最大值被限制在10以内如何解决

R读取NBA CSV数据后数值列最大值统计异常解决方案

问题描述

开展NBA数据可视化个人项目时,读取CSV文件生成R Dataframe后,对得分(PTS)、出手数(FGA)、三分出手数(3PA)等字段做排序和最大值统计时,发现所有列返回的最大值均不超过10:例如斯蒂芬·库里的三分出手数实际大于10,但运行max(stats$3pa)返回结果为9.2,运行max(stats$PTS)返回结果为9.9。

样例数据输出

dput(head(stats))的输出如下:

> dput(head(stats))
structure(list(Player = c("Precious Achiuwa", "Steven Adams", 
"Bam Adebayo", "LaMarcus Aldridge", "Ty-Shon Alexander", "Nickeil Alexander-Walker"
), Pos = c("PF", "C", "C", "C", "SG", "SG"), Age = c("21", "27", 
"23", "35", "22", "22"), Tm = c("MIA", "NOP", "MIA", "TOT", "PHO", 
"NOP"), G = c("61", "58", "64", "26", "15", "46"), GS = c("4", 
"58", "64", "23", "0", "13"), MP = c("12.1", "27.7", "33.5", 
"25.9", "3.1", "21.9"), FG = c("2.0", "3.3", "7.1", "5.4", "0.2", 
"4.2"), FGA = c("3.7", "5.3", "12.5", "11.4", "0.8", "10.0"), 
    `FG%` = c(".544", ".614", ".570", ".473", ".250", ".419"), 
    `3P` = c("0.0", "0.0", "0.0", "1.2", "0.1", "1.7"), `3PA` = c("0.0", 
    "0.1", "0.1", "3.1", "0.6", "4.8"), `3P%` = c(".000", ".000", 
    ".250", ".388", ".222", ".347"), `2P` = c("2.0", "3.3", "7.1", 
    "4.2", "0.1", "2.5"), `2PA` = c("3.7", "5.3", "12.4", "8.3", 
    "0.2", "5.2"), `2P%` = c(".546", ".620", ".573", ".505", 
    ".333", ".485"), `eFG%` = c(".544", ".614", ".571", ".525", 
    ".333", ".502"), FT = c("0.9", "1.0", "4.4", "1.6", "0.1", 
    "1.0"), FTA = c("1.8", "2.3", "5.5", "1.8", "0.1", "1.4"), 
    `FT%` = c(".509", ".444", ".799", ".872", ".500", ".727"), 
    ORB = c("1.2", "3.7", "2.2", "0.7", "0.1", "0.3"), DRB = c("2.2", 
    "5.2", "6.7", "3.8", "0.5", "2.8"), TRB = c("3.4", "8.9", 
    "9.0", "4.5", "0.7", "3.1"), AST = c("0.5", "1.9", "5.4", 
    "1.9", "0.4", "2.2"), STL = c("0.3", "0.9", "1.2", "0.4", 
    "0.0", "1.0"), BLK = c("0.5", "0.7", "1.0", "1.1", "0.1", 
    "0.5"), TOV = c("0.7", "1.3", "2.6", "1.0", "0.2", "1.5"), 
    PF = c("1.5", "1.9", "2.3", "1.8", "0.1", "1.9"), PTS = c("5.0", 
    "7.6", "18.7", "13.5", "0.6", "11.0"), c(" ", " ", " ", " ", 
    " ", " ")), row.names = c("1", "3", "4", "5", "6", "7"), class = "data.frame")

根因分析

从样例数据可以看到,所有数值列的取值都被引号包裹,说明读取CSV时R将这些字段默认识别为字符型而非数值型。max()函数对字符型数据执行计算时,会按照字符串字典序排序而非数值大小排序,例如字符串"9.9"的字典序大于"18.7",所以最终返回的最大值均为个位数,和实际数值逻辑不符。

解决方法

  • 单次计算场景:仅需要临时计算某一列的最大值时,先将列转换为数值型再执行最大值统计,正确写法为:
    max(as.numeric(stats$`3PA`))
    
    注:如果先执行字符型最大值计算再转换数值,仍然会得到错误结果,需注意转换顺序。
  • 全局处理场景:如果后续要做大量统计、可视化操作,建议读取CSV时就指定列类型,或者读取后批量将数值列转换为numeric类型,避免后续重复出现同类问题。

内容的提问来源于stack exchange,提问作者CodeMonke

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 23:39:02