[使用grep作为r data.table fread()中的命令行工具-错误的结果

问题描述 投票:2回答:1

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忽略了行首命令(没有尝试其他正则表达式)。这是怎么了?

r grep data.table fread
1个回答
0
投票

非常感谢你,弗兰克。我不明白您的建议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()失败)。

© www.soinside.com 2019 - 2024. All rights reserved.