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

read_csv2读取数据时sum()结果异常,如何修正?

解决read_csv2读取Excel导出CSV时sum计算严重偏差的问题

问题背景

使用read_csv2读取Excel导出的分号分隔CSV文件,数据包含product和value(原描述为count)两列,value列值为整数或NA。出现以下问题:

  • 小于1000的整数被解析为带.000的格式(如15变为15.000)
  • 单个值运算正常(如data$value[[15]]返回15,相加结果正确)
  • 但sum(data$value)结果偏差极大(返回约700万,实际应为约14万)

当前读取代码:

data = read_csv2('data.csv', col_types = c('c','n'), col_names = c('product','value'), skip = 1)%>% arrange(product)

已尝试将col_type从'n'改为'i',以及执行data$value = round(data$value),均无效。

问题原因

read_csv2是为欧洲地区格式设计的读取函数,默认参数为:

  • 分隔符:分号(sep = ";")
  • 小数点:逗号(decimal = ",")
  • 千分位分隔符:点(big.mark = ".")

而你从Excel导出的CSV文件使用点作为小数点(如15.000),这导致read_csv2错误地将点识别为千分位分隔符,把15.000解析成了15000——这就是sum结果严重偏大的核心原因。之前的修改(改列类型、round)都没有修正解析阶段的格式错误,所以无效。

解决方案

读取时显式指定decimal = ".",告诉read_csv2小数点是点,而非逗号:

方案1:直接指定列类型为整数

data = read_csv2('data.csv', 
                 col_types = cols(
                   product = col_character(),
                   value = col_integer()
                 ), 
                 col_names = c('product','value'), 
                 skip = 1,
                 decimal = ".") %>% 
  arrange(product)

方案2:先读取为数值型再转整数(适合含NA的场景)

data = read_csv2('data.csv', 
                 col_types = c('c','d'), 
                 col_names = c('product','value'), 
                 skip = 1,
                 decimal = ".") %>% 
  mutate(value = as.integer(value)) %>%
  arrange(product)

验证方法

读取后检查value列的数值:

head(data$value)
sum(data$value)

确认小整数被正确解析为原数值(如15而非15000),sum结果即可恢复正常。

内容的提问来源于stack exchange,提问作者Théodore Targerian

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 05:35:00