R语言 使用大小写不变的字符串参数导入CSV

7nbnzgx9  于 2023-11-14  发布在  其他
关注(0)|答案(2)|浏览(116)

我有一个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

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

#      A    B    C
# 1    1   NA   NA
# 2    4  abc   NA
# 3   NA  def   NA


read.csv()命令的na.string接受一个字符串的字符向量来替换为NA,但是大小写变体最初是未知的,并且有太多的排列使其不实用。
有没有一种方法可以使用正则表达式或其他替代方法来导入所有的大小写变化作为NA,而不指定它们中的每一个?在这种特定的情况下,重要的是要在阅读数据时实现这一点 *(即,在read.csv或类似的范围内),而不是在额外的步骤中(即,读取数据,然后使用额外的代码来清理,(即,像here那样完成)。
我试过了:

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


我已经尝试了类似的方法与data.table::freadreadr::read_csv,但没有一个返回所需的输出(返回类似于上面的输出/错误)。不幸的是,没有一个现有的SO问题解决特定的问题(即,make csv data import case insensitiveCase-insensitive search of a list in R

erhoui1w

erhoui1w1#

将评论升级为澄清后的答案:
您可以导入原始文本,应用正则表达式替换,然后将其传递给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

字符串

pvabu6sv

pvabu6sv2#

在fread内替换-使用sed

data.table::fread("sed 's/not indicated/NA/gI' tmp.csv")
#     A  B  C
# 1:  1 NA NA
# 2:  4  5 NA
# 3: NA  8 NA

字符串
检查操作系统,然后运行等效的“sed”命令:

相关问题