我有一个文本文件,其中每一行都以已知的字符标识符开头(*是分隔符):
AAA*123456789*.*.*.
BBB*123456789*.*.*.
CCC*123456789*.*.*.
.
.
.
ZZZ*123456789*.*.*.
问题是即使信息是以这种方式组织的。从AAA到ZZZ的每一行代表该特定数据中的一条记录。因此,在ZZZ线之后,数据再次返回到ZZZ的AAA。
除了使用for循环和逐行处理之外,还有一种方法可以将从AAA到ZZZ的行块取出并基本上将它放在一行上,这样我可以在之后用分隔符分隔出每一行吗?
或者,如果您对处理此类数据有任何其他建议,请与我们联系。
谢谢,
答案 0 :(得分:1)
我们可以使用tapply
到paste
元素
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*.*.*."))
答案 1 :(得分:0)
使用最后注释中的示例数据将其读入数据框,创建分组变量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*.*.*."