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

