使用read_csv跳过列时如何通过缩写指定列类型
问题原因
readr的col_types参数传入的类型缩写字符串,是按照CSV文件的原始列顺序逐个匹配的,而非你通过col_select筛选后的列顺序。你示例中写的"cc"仅会将原始第1、2列(a、b)设为字符型,你筛选掉b列后,拿到的c列是原始第3列,没有匹配到你指定的类型,所以被自动猜测为双精度型。
目前readr原生不支持直接用缩写字符串匹配筛选后的列顺序,下面两种方案都可以避免你为大量跳过的列手动填写-标记:
方案1:动态生成列类型命名向量
如果要选中的列数多,不用手动逐个指定列名和类型,提前把要选的列存入向量,自动生成对应类型映射:
library(tidyverse) # 定义需要读取的列名 sel_cols <- c("a", "c") # 自动生成类型映射,这里统一设为字符型,可根据需求调整rep的第一个参数 col_types <- setNames(rep("c", length(sel_cols)), sel_cols) test <- read_csv( "test.csv", col_select = all_of(sel_cols), col_types = col_types ) typeof(test$c) #> [1] "character"
方案2:使用cols_only()函数
cols_only()是readr专门为「仅读取指定列并设置类型」设计的功能,无需额外写col_select,未在cols_only中声明的列会自动跳过:
# 手动指定少量列的场景 test <- read_csv( "test.csv", col_types = cols_only(a = "c", c = "c") ) # 大量列需要读取的场景,结合动态生成的参数调用 sel_cols <- c("a", "c") col_spec <- do.call(cols_only, as.list(setNames(rep("c", length(sel_cols)), sel_cols))) test <- read_csv("test.csv", col_types = col_spec)
内容的提问来源于stack exchange,提问作者nicholas
相关产品推荐
相关产品推荐

