使用不区分大小写的 na.strings 参数导入 CSV

jps*_*ith 4 csv r

我有一个 CSV 文件,我试图导入其中大小写不一致的变体以指示丢失的数据,例如:

read.csv(
  text = "A,B,C
  1,Not indicated, NOT indicated
  4,abc,not indicated
  NOT INDICATED, def, noT InDiCated")

#                 A             B              C
# 1               1 Not indicated  NOT indicated
# 2               4           abc  not indicated
# 3   NOT INDICATED           def  noT InDiCated
Run Code Online (Sandbox Code Playgroud)

我试图将它们作为函数(或来自另一个包的类似函数)导入NA 忽略read.csv()大小写。我想要的输出是:

#      A    B    C
# 1    1   NA   NA
# 2    4  abc   NA
# 3   NA  def   NA
Run Code Online (Sandbox Code Playgroud)

read.csv()命令na.string接受字符串的字符向量来替换NA,但大小写变体最初是未知的,并且有太多的排列使其不切实际。

有没有一种方法可以使用正则表达式或其他替代方法来导入所有大小写变体,NA而不指定它们中的每一个?在这种特定情况下,重要的是在读入数据时(即,在数据内或类似的)而不是在附加步骤中实现这一点(即,读入数据,然后使用附加代码进行清理,(即,如此read.csv所做的)。

我试过了:

read.csv(
  text = "A,B,C
  1,Not indicated, NOT indicated
  4,abc,not indicated
  NOT INDICATED, def, noT InDiCated" 
  na.strings = "(?i)not (?i)indicated") ## nothing is replaced

read.csv(
  text = "A,B,C
  1,Not indicated, NOT indicated
  4,abc,not indicated
  NOT INDICATED, def, noT InDiCated", 
  na.strings = c("not indicated"), 
  ignore.case = TRUE) # Returns error/unused argument

read.csv(
  text = "A,B,C
  1,Not indicated, NOT indicated
  4,abc,not indicated
  NOT INDICATED, def, noT InDiCated",
  na.strings = stringr::regex("not indicated", ignore_case = TRUE)) # does not return NA for any of the variants

Run Code Online (Sandbox Code Playgroud)

我尝试过使用data.table::fread和类似的方法readr::read_csv,但它们都没有返回所需的输出(返回与上面类似的输出/错误)。不幸的是,现有的 SO 问题都没有解决具体问题(即,使 csv 数据导入不区分大小写在 R 中对列表进行不区分大小写的搜索

the*_*ail 5

澄清后将评论升级为答案:

您可以导入原始文本,应用正则表达式替换,然后将其传递到read.csv. 这将阻止对列类型等的猜测,直到某些字符串被删除之后。

scan()这不完全是你想要的,但我认为按照所要求的方式这是不可能的na.strings=

一个(不是很稳健的)尝试,可以作为一个起点:

read.csv(
   text=gsub("not indicated", "NA", 
          readChar("test.csv", nchars=file.size("test.csv"), useBytes=TRUE),
          ignore.case=TRUE), 
   na.strings="NA", strip.white=TRUE
)

##   A  B  C
##1  1 NA NA
##2  4  5 NA
##3 NA  8 NA
Run Code Online (Sandbox Code Playgroud)