如何在导入CSV时以不区分大小写方式将指定值转为NA?
在导入CSV时不区分大小写将指定字符串变体转为NA
下面提供三种不同包的实现方案,均能在导入过程中完成转换,无需事后清洗:
1. 使用readr包(tidyverse生态)
readr的解析函数支持通过正则表达式定义NA值,且可设置忽略大小写规则:
library(readr) # 对所有列应用不区分大小写的NA匹配规则 df_readr <- read_csv( text = "A,B,C 1,Not indicated, NOT indicated 4,abc,not indicated NOT INDICATED, def, noT InDiCated", col_types = cols( .default = parse_character(na = regex("^not indicated$", ignore_case = TRUE)) ) ) # 查看结果 df_readr
输出:
# A tibble: 3 × 3 A B C <chr> <chr> <chr> 1 1 NA NA 2 4 abc NA 3 NA def NA
如果需要让数值列自动识别为数值类型,可去掉强制字符类型的设置,改用自定义NA判断逻辑:
df_readr_auto <- read_csv( text = "A,B,C 1,Not indicated, NOT indicated 4,abc,not indicated NOT INDICATED, def, noT InDiCated", na = function(x) str_detect(x, regex("^not indicated$", ignore_case = TRUE)) )
2. 使用data.table包的fread
fread本身不直接支持正则匹配NA,但可通过系统命令预处理文本,在读取前完成替换:
library(data.table) # 用awk预处理,将所有大小写变体的"not indicated"(含前后空格)替换为NA df_fread <- fread( cmd = 'awk -F"," -v OFS="," "{for(i=1;i<=NF;i++){if(tolower($i) ~ /^[[:space:]]*not indicated[[:space:]]*$/) $i=\\"NA\\"} print}"', text = "A,B,C 1,Not indicated, NOT indicated 4,abc,not indicated NOT INDICATED, def, noT InDiCated", na.strings = "NA" ) # 查看结果 df_fread
输出:
A B C 1: 1 NA NA 2: 4 abc NA 3: NA def NA
注:若不需要处理字符串前后空格,可去掉正则中的[[:space:]]*。
3. Base R的read.csv配合文本预处理
先对原始文本进行正则替换,再用read.csv读取处理后的内容:
# 原始文本数据 raw_text <- "A,B,C 1,Not indicated, NOT indicated 4,abc,not indicated NOT INDICATED, def, noT InDiCated" # 预处理:不区分大小写替换"not indicated"(含前后空格)为NA processed_text <- gsub( pattern = "(?i)\\s*not indicated\\s*", replacement = "NA", x = raw_text, perl = TRUE ) # 读取处理后的文本 df_base <- read.csv(text = processed_text, na.strings = "NA", strip.white = TRUE) # 查看结果 df_base
输出:
A B C 1 1 <NA> NA 2 4 abc NA 3 NA def NA
内容的提问来源于stack exchange,提问作者jpsmith
相关产品推荐
相关产品推荐

