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
相关产品推荐
相关产品推荐

