Hello,
这是我在这里的第一篇文章。我使用了出色的R data.table包。我需要导入一个没有注释行的文件,但是我看不到fread()中的任何选项来消除注释行,这些注释行不仅分布在文件的开头,而且分布在整个文件中。为简化起见-文件test.txt由4行组成,注释行以“#”开头:
#A
A AA
A A#A
#A
我使用fread()导入数据,然后使用grep(^#)删除注释行;一切正常。还有一个选项可以将fread()中的grep用作命令行调用,而不是单个文件名。 (出于记录,我在Windows中工作,因此我的项目文件夹中有grep.exe。)当从R调用它时,Grep可以按预期使用简单的正则表达式:
> system("grep # test.txt")
#A
A A#A
#A
> system("grep ^# test.txt")
#A
#A
但是当在fread()函数中作为系统命令调用时,它将忽略行命令“ ^”的开头:
> fread("grep # test.txt", sep = "\t", header = FALSE, fill = TRUE)
V1 V2
1: #A
2: A A#A
3: #A
> fread("grep ^# test.txt", sep = "\t", header = FALSE, fill = TRUE)
V1 V2
1: #A
2: A A#A
3: #A
因此,R中的grep.exe以及grep()均按预期工作,但是从fread()调用的grep.exe忽略了行首命令(没有尝试其他正则表达式)。这是怎么了?
非常感谢你,弗兰克。我不明白您的建议fread('grep "^#" test.txt', sep = "\t", header = FALSE, fill = TRUE)
为何正常工作,但是fread("grep '^#' test.txt", sep = "\t", header = FALSE, fill = TRUE)
(我尝试过)却导致错误。
[此外,我注意到在fread()中对grep进行系统调用比使用fread()然后在R中使用grep()读取文件要慢两倍。其中是注释行。也许,如果注释行的比例更大,则系统调用会更快,因为在这种情况下,您无需将注释行导入到data.table中(在导入前无需grep调用,我需要使用fill = TRUE向注释行中缺少的列添加空值,否则fread()失败)。