使用read_csv时col_types参数未按预期解析列类型的技术问题
问题:read_csv中col_types与col_select配合时类型解析异常的原因
使用read_csv读取数据时,通过col_select指定需读取的列,并用col_types的短格式字符串指定列类型,但在第二个示例中,read_var_3被解析为double类型的NA,而非预期的character类型"text"。
复现代码
d1=tibble(read_var_2="2024-02-29",read_var_1="4",ignore_var_1="null",read_var_3="text") write_csv(d1,"data_d1.csv") test_d1 = read_csv( "data_d1.csv", col_select = c("read_var_2", "read_var_1", "read_var_3"), col_types = "Ddc" ) test_d1 ## works as expected # # A tibble: 1 × 3 # read_var_2 read_var_1 read_var_3 # <date> <dbl> <chr> # 1 2024-02-29 4 text d2=tibble(read_var_2="2024-02-29",read_var_1="4",ignore_var_1="null",read_var_3="text",read_var_4="37.89") write_csv(d2,"data_d2.csv") test_d2 = read_csv( "data_d2.csv", col_select = all_of(c("read_var_2", "read_var_1", "read_var_3", "read_var_4")), col_types = "Ddcd" ) ## PROBLEM test_d2 ## why is read_var_3 NA dbl, it should be character "text"? # # A tibble: 1 × 4 # read_var_2 read_var_1 read_var_3 read_var_4 # <date> <dbl> <dbl> <dbl> # 1 2024-02-29 4 NA 37.9
原因分析
col_types的短格式字符串是按照原始CSV文件的列顺序进行匹配,而非col_select指定的列顺序。
在第二个示例中,data_d2.csv的原始列顺序为:read_var_2、read_var_1、ignore_var_1、read_var_3、read_var_4。你传入的col_types = "Ddcd"对应原始文件的前4列:
- 第1列(
read_var_2):D(日期类型) - 第2列(
read_var_1):d(double类型) - 第3列(
ignore_var_1):c(字符类型) - 第4列(
read_var_3):d(double类型)
而read_var_3的实际值是"text",无法解析为double类型,因此变成NA。同时,原始第5列read_var_4未被col_types指定,自动解析为double类型,最终出现你看到的结果。
解决方法
有两种可靠的解决方式:
1. 使用命名式col_types(推荐)
通过cols()函数按变量名指定类型,不受列顺序影响:
test_d2 = read_csv( "data_d2.csv", col_select = all_of(c("read_var_2", "read_var_1", "read_var_3", "read_var_4")), col_types = cols( read_var_2 = col_date(), read_var_1 = col_double(), read_var_3 = col_character(), read_var_4 = col_double() ) )
2. 调整短格式字符串适配原始列顺序
如果坚持使用短格式,需要包含原始文件的所有列,用下划线_表示忽略不需要的列:
test_d2 = read_csv( "data_d2.csv", col_select = all_of(c("read_var_2", "read_var_1", "read_var_3", "read_var_4")), col_types = "Dd_cd" # 下划线对应原始第3列ignore_var_1,忽略该列 )
内容的提问来源于stack exchange,提问作者mrroy
相关产品推荐
相关产品推荐

