仅在一列上使用带有 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 不存在于模式中,那么您可能想要添加函数来修复它。
我试图只将一个非常大的 .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 不存在于模式中,那么您可能想要添加函数来修复它。