【问题标题】:best/fastest way to read a chunk of lines from a text file that are separated by identifiers in R从 R 中的标识符分隔的文本文件中读取一大块行的最佳/最快方法
【发布时间】:2017-12-11 16:09:50
【问题描述】:

我有一个文本文件,其中每一行都以已知的字符标识符开头(* 是分隔符):

AAA*123456789*.*.*.
BBB*123456789*.*.*.
CCC*123456789*.*.*.
.
.
.
ZZZ*123456789*.*.*.

问题在于即使以这种方式组织信息。从 AAA 到 ZZZ 的每一行代表此特定数据中的一条记录。因此,在那条 ZZZ 线之后,数据再次回到 AAA 直到 ZZZ。

除了使用for循环和逐行处理之外,有没有办法将大块的行从AAA带到ZZZ并基本上放在一行上,这样我之后就可以用分隔符分隔每一行了?

如果您对处理此类数据有任何其他建议,请告诉我。

谢谢,

【问题讨论】:

  • 试试tapply(lines, cumsum(grepl("^AAA"., lines)), FUN = paste, collapse="")
  • 我想我不久前看到了一个类似问题的优雅解决方案,它使用了read.dcf,但我找不到它。一般的方法是使用readLines,然后使用split(lines, cumsum(grepl('^AAA', lines),为每个元素创建一个命名列表/数据框,然后在结果上调用do.call(rbind, ...) 或等效项。如需完整答案,请使用更具代表性的示例数据进行编辑。

标签: r parsing text


【解决方案1】:

我们可以使用tapplypaste 的元素

tapply(lines, cumsum(grepl("^AAA", lines)), FUN = paste, collapse="")

也没有使用任何包

数据

lines <- readLines(textConnection("AAA*123456789*.*.*.
BBB*123456789*.*.*.
CCC*123456789*.*.*.
ZZZ*123456789*.*.*.
AAA*123456789*.*.*.
BBB*123456789*.*.*.
CCC*123456789*.*.*.
ZZZ*123456789*.*.*."))

【讨论】:

    【解决方案2】:

    使用最后注释中的示例数据将其读入数据框,创建分组变量g,然后使用reshape将其从长格式转换为宽格式。不使用任何包。 text=Lines 可以替换为文件名,例如"myfile",如果输入来自文件。

    DF <- read.table(text = Lines, sep = "*", as.is = TRUE, strip.white = TRUE)
    DF$g <- cumsum(DF$V1 == "AAA")
    reshape(DF, dir = "wide", idvar = "g", timevar = "V1")
    

    注意:

    Lines <- "AAA*123456789*.*.*.
    BBB*123456789*.*.*.
    CCC*123456789*.*.*.
    AAA*123456789*.*.*.
    BBB*123456789*.*.*.
    CCC*123456789*.*.*."
    

    【讨论】:

      猜你喜欢
      • 2011-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-07
      • 1970-01-01
      • 2012-08-06
      相关资源
      最近更新 更多