使用map_df读取txt文件遇‘行含嵌入空值’警告及参数报错求助
问题解决思路
1. 解决「unused argument (id = "data_source")」错误
报错原因是把map_df的.id参数误传给了read.delim。.id是map_df的专属参数,用来生成记录来源文件名的列,不能和read.delim的参数混传。正确写法是用匿名函数包裹read.delim,将编码参数传给read.delim,.id留在map_df参数中:
# 指定编码并保留data_source列 data <- map_df(.x = files, .f = function(file) { read.delim(file, fileEncoding = "UTF-8") }, .id = 'data_source')
如果需要把实际文件名作为data_source的值(而非默认的索引数字),可以修改为:
data <- map_df(set_names(files, files), .f = function(file) { read.delim(file, fileEncoding = "UTF-8") }, .id = 'data_source')
2. 解决「line 'x' appears to contain embedded nulls」警告
该警告源于部分txt文件包含空值字符(\0),read.delim默认无法处理,可通过以下两种方法解决:
方法一:先过滤空值字符再读取
用readLines读取所有行,过滤掉包含空值的行后再传给read.delim:
data <- map_df(set_names(files, files), .f = function(file) { # 读取行并过滤空值字符 lines <- readLines(file, warn = FALSE) lines_clean <- lines[!grepl("\0", lines)] # 读取清理后的内容 read.delim(textConnection(lines_clean), fileEncoding = "UTF-8") }, .id = 'data_source')
方法二:用skipNul参数跳过空值行(R 3.0.0+支持)
read.delim是read.table的封装,直接传递skipNul=TRUE即可跳过包含空值的行:
data <- map_df(set_names(files, files), .f = function(file) { read.delim(file, fileEncoding = "UTF-8", skipNul = TRUE) }, .id = 'data_source')
额外优化建议
尽量避免使用setwd(),直接指定完整文件路径更安全:
# 生成完整文件路径 full_paths <- file.path(pwd, sprintf("%02d", pnum), files) # 用完整路径读取 data <- map_df(set_names(full_paths, basename(full_paths)), .f = function(path) { read.delim(path, fileEncoding = "UTF-8", skipNul = TRUE) }, .id = 'data_source')
内容的提问来源于stack exchange,提问作者banzecoleco
相关产品推荐
相关产品推荐

