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

R中read.csv与read_csv处理NULL值的差异及问题咨询

问题:read.csv与read_csv导入CSV时NULL值识别差异

作为接触R语言和大型数据集约5周的新手,我在导入CSV文件时遇到问题:使用read.csv函数将CSV存入data frame后,NULL值未被识别;但使用read_csv函数却能保留NULL值。以下是测试代码及输出:

使用read.csv的测试代码

#导入CSV文件
(jan_data <- read.csv('202301-divvy-tripdata.csv'))

#检查整个data frame中的NULL值
missing_values_df <- is.na(jan_data)

#打印指示NULL值的逻辑矩阵
print(missing_values_df)

#统计每列的NULL值数量
print(colSums(missing_values_df))

输出

ride_id      rideable_type         started_at           ended_at start_station_name 
                 0                  0                  0                  0                  0 
  start_station_id   end_station_name     end_station_id          start_lat          start_lng 
                 0                  0                  0                  0                  0 
           end_lat            end_lng      member_casual 
               127                127                  0 

使用readr::read_csv()的测试代码

jan_data <- read_csv('202301-divvy-tripdata.csv')

#检查整个data frame中的NULL值
missing_values_df <- is.na(jan_data)

#打印指示NULL值的逻辑矩阵
print(missing_values_df)

#统计每列的NULL值数量
print(colSums(missing_values_df))

输出

ride_id      rideable_type         started_at           ended_at start_station_name 
                 0                  0                  0                  0              26721 
  start_station_id   end_station_name     end_station_id          start_lat          start_lng 
             26721              27840              27840                  0                  0 
           end_lat            end_lng      member_casual 
               127                127                  0 

请问为何会出现这种差异?


解答

这两个函数的核心差异在于缺失值的默认处理规则以及底层解析逻辑不同:

  • read.csv(基础R函数)的默认行为
    read.csv是read.table的封装,默认会把CSV里的空字符串("")解析为空因子水平(列默认是因子类型)或空字符串(若指定stringsAsFactors=FALSE),不会自动转为NA。你的数据中start_station_name等列的缺失值实际是空字符串,所以is.na()无法识别。
    要让它识别这类缺失值,需手动设置参数:

    jan_data <- read.csv('202301-divvy-tripdata.csv', stringsAsFactors = FALSE, na.strings = c("", "NA"))
    
  • readr::read_csv(tidyverse工具)的默认行为
    read_csv属于tidyverse生态,默认会将CSV中的空字符串自动映射为NA,同时它的类型推断更智能,默认把文本列识别为字符型而非因子型,因此能正确标记这些缺失值。此外它的解析引擎基于C++,处理大型数据集效率也更高,默认行为更贴合现代数据处理的常见需求。

简单来说,两者对“CSV空值如何对应R的缺失值”有不同默认设定:read.csv偏保守,需手动指定规则;read_csv的默认规则更符合数据处理的常规预期。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 12:22:19