我有一个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::fread
和readr::read_csv
,但没有一个返回所需的输出(返回类似于上面的输出/错误)。不幸的是,没有一个现有的SO问题解决特定的问题(即,make csv data import case insensitive或Case-insensitive search of a list in R)
2条答案
按热度按时间erhoui1w1#
将评论升级为澄清后的答案:
您可以导入原始文本,应用正则表达式替换,然后将其传递给
read.csv
。这将阻止对列类型等的猜测,直到某些字符串被剥离。这并不完全是你想要的,但我认为这是不可能的,因为
scan()
被称为na.strings=
。一个(不是很强的)尝试,可以作为一个起点:
字符串
pvabu6sv2#
在fread内替换-使用
sed
:字符串
检查操作系统,然后运行等效的“sed”命令: