【发布时间】:2017-03-25 16:12:06
【问题描述】:
原始数据 (.txt) 文件有 65926 个元素,每个元素包含 142 个字符串。
这是原始数据文件的dropbox link。
任务是将这 142 个字符串分成 37 个较小的字符串(每个子字符串是一个单独的字符变量),每个字符串从以下位置顺序开始: 1,4,9,11,14,15,16,19,21,24,26,27,28,32,33,34,36,38,43,45,46,47,48,52,56, 60,66,72,75,76,77,78,79,80,127,130,133
最终输出必须是 65926 x 37 的数据帧。这是输出数据帧的快照:
这是我正在使用的代码:
x <- readLines("R71252L01.TXT")
a <- c(1,4,9,11,14,15,16,19,21,24,26,27,28,32,33,34,36,38,43,45,46,47,48,52,56,60,66,72,75,76,77,78,79,80,127,130,133)
z <- data.frame(matrix(nrow = length(x), ncol = length(a)), stringsAsFactors = FALSE)
for (i in 1:length(x) ) {
z[i,] <- (list(
(c(substr(x[i], 1, 3),substr(x[i], 4, 8),substr(x[i], 9, 10),
substr(x[i], 11, 13),substr(x[i], 14, 14),substr(x[i], 15, 15),
substr(x[i], 16, 18),substr(x[i], 19, 20),substr(x[i], 21, 23),
substr(x[i], 24, 25),substr(x[i], 26, 26),substr(x[i], 27, 27),
substr(x[i], 28, 31),substr(x[i], 32, 32),substr(x[i], 33, 33),
substr(x[i], 34, 35),substr(x[i], 36, 37),substr(x[i], 38, 42),
substr(x[i], 43, 44),substr(x[i], 45, 45),substr(x[i], 46, 46),
substr(x[i], 47, 47),substr(x[i], 48, 51),substr(x[i], 52, 55),
substr(x[i], 56, 56),substr(x[i], 60, 65),substr(x[i], 66, 71),
substr(x[i], 72, 74),substr(x[i], 75, 75),substr(x[i], 76, 76),
substr(x[i], 77, 77),substr(x[i], 78, 78),substr(x[i], 79, 79),
substr(x[i], 80, 126),substr(x[i], 127, 129),substr(x[i], 130, 132),
substr(x[i], 133, 142)
) )
) )
i <- i+1
}
代码有效,但有两个问题:
-
substr()的开始和停止索引必须手动输入。有什么方法可以利用矢量a来代替所有的体力劳动? -
代码需要 30 多分钟才能执行。检查时间:
> system.time(source('Hitesh_Script.R')) user system elapsed 4452.464 9.440 4476.018这可以更快地完成吗?
我必须对几个原始数据文件执行此任务,每个文件都有一个不同的向量a。因此,任何其他关于效率的建议也将受到赞赏。非常感谢!
【问题讨论】:
-
如果您能分享一小部分“z”样本供我们研究,那就太好了!
-
一般来说,如果有矢量化替代方案,请避免在大型数据帧(
for (i in 1:length(x) )或for (i in seq_along(x) ))上使用 for 循环。
标签: r dataframe vectorization substring variable-length