【问题标题】:Using fread with grep on only one column仅在一列上使用 fread 和 grep
【发布时间】:2021-04-18 19:38:23
【问题描述】:

我正在尝试仅将一个非常大的 .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 可以使用 $2~^11 之类的东西,但我在无法安装的远程机器上,而且它似乎也无法调用。

【问题讨论】:

    标签: r data.table fread


    【解决方案1】:

    如果您有创意,可以尝试以下方法:

    #' @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 然后读入结果文件。换句话说,如果您的标头在模式中不存在,那么您可能希望在函数上添加来修复它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-09
      • 2018-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-02
      相关资源
      最近更新 更多