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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 02:47:48