仅在一列上使用带有 grep 的 fread

Using fread with grep on only one column

我试图只将一个非常大的 .csv 文件的一部分读入 R。数据如下所示:

id   var1
111  A345
112  110
113  456

我只想要 var1 中以“11”开头的行。但这给出了这个例子中的所有行:

fread(cmd = paste('grep', '"^11"', 'mycsv.csv'), colClasses = c("integer", "character"))

我认为 gawk/awk 可以使用类似 ~^11 的东西,但我在一台无法安装的远程机器上,它似乎无法调用要么。

如果你有创意,你可以尝试这样的事情:

#' @param file path to file.
#' @param sep delimiter for file.
#' @param pattern extended regular expression.
#' @param column_indx number index of column to apply pattern on.
#' @param ... additional arguments to pass to fread
fread_grep_column <- function(file, sep, pattern, column_indx, ...){
  cmd <- paste0("grep -E ", "'^", paste(c(rep("(.*)", column_indx-1), pattern), collapse = sep), "' ", file)
  cat(cmd, "\n") #just for debugging
  fread(cmd = cmd, ...)
}

此函数将尝试创建一个正则表达式,在正确的行上匹配您的模式。

虽然这可能只对您非常熟悉的文件最有效。例如,您需要知道您正在搜索的列是否以引号开头。我敢肯定还有其他方法可以破坏此功能,我只是还没有想到任何好的例子。

要记住一件事 - 它会先 grep 然后读入结果文件。换句话说,如果您 headers 不存在于模式中,那么您可能想要添加函数来修复它。