能否在cols_only()中使用tidyselect辅助函数指定导入列及格式?
解决
read_csv中用tidyselect批量指定列与类型的问题 你之前的写法报错,是因为cols_only()的参数要求是具体列名=列类型的键值对,不能直接在参数名位置使用starts_with()这类tidyselect选择器,语法上不支持这种写法。
下面提供两种可行的解决方法:
方法1:结合col_select与cols(where())
利用read_csv的col_select参数批量选择要导入的列,再用cols()配合where()根据列名规则指定对应类型:
library(tidyverse) df2 <- read_csv("df.csv", # 用tidyselect选择需要导入的列 col_select = c(starts_with("id"), starts_with("data") & !ends_with("s")), # 根据列名规则指定类型 cols( where(~str_detect(.x, "^id")) = col_character(), where(~str_detect(.x, "^data") & !str_detect(.x, "s$")) = col_integer() ) )
方法2:先构造列规范再导入
先读取CSV的列名,筛选出目标列后构造cols_only需要的参数列表,再用!!!拼接导入:
library(tidyverse) # 仅读取列名,不加载数据 all_col_names <- read_csv("df.csv", n_max = 0) %>% names() # 筛选目标列 id_cols <- str_subset(all_col_names, "^id") data_target_cols <- str_subset(all_col_names, "^data") %>% str_subset("s$", negate = TRUE) # 构造列类型规范 col_spec <- c( set_names(rep(col_character(), length(id_cols)), id_cols), set_names(rep(col_integer(), length(data_target_cols)), data_target_cols) ) # 导入数据 df2 <- read_csv("df.csv", cols_only(!!!col_spec))
两种方法都能实现批量选择列并指定类型的需求,第一种更简洁直接,第二种适合需要更灵活处理列名的场景。
内容的提问来源于stack exchange,提问作者nicholas
相关产品推荐
相关产品推荐

