使用map_dfr与read_delim时如何指定col_type?
解决多TXT文件合并时的类型不匹配与参数传递错误
错误原因分析
- 类型不匹配报错:不同文件中
BUSINESS_UNIT列被自动识别为不同类型(部分为double、部分为character),合并时类型冲突。 argument "file" missing错误:直接在map_dfr中调用read_delim(col_types = ...)时,没有传入必需的file参数,read_delim会立即执行而非作为函数传递给map_dfr。- 无法转换对象为函数的错误:错误地传递
(.)参数,导致给map_dfr的是read_delim执行后的结果(数据框),而非函数本身。
正确解决方案
方法1:使用匿名函数
通过匿名函数明确传递文件路径给read_delim,同时指定列类型:
read_files <- fs::dir_ls(folder_path) %>% purrr::map_dfr(function(file) { read_delim(file, col_types = list(BUSINESS_UNIT = col_character())) }, .id = "source")
方法2:使用purrr公式语法(更简洁)
用~定义匿名函数,.x代表dir_ls返回的每个文件路径:
read_files <- fs::dir_ls(folder_path) %>% purrr::map_dfr(~ read_delim(.x, col_types = list(BUSINESS_UNIT = col_character())), .id = "source")
扩展:指定多列类型
如果需要统一更多列的类型,推荐用cols()函数明确定义所有列类型,避免遗漏:
read_files <- fs::dir_ls(folder_path) %>% purrr::map_dfr(~ read_delim(.x, col_types = cols( BUSINESS_UNIT = col_character(), ORDER_ID = col_double(), CREATE_DATE = col_date(format = "%Y-%m-%d") )), .id = "source")
内容的提问来源于stack exchange,提问作者Din
相关产品推荐
相关产品推荐

