我不知道此类操作的正确技术术语,因此很难搜索现有的解决方案。我想我会尝试发表自己的问题,希望有人可以帮助我(或指出我正确的方向)。
我有一个字符矢量,我想以三三两组的形式收集它们。为了说明,这是一个简化版本:
我的表格:
"a" "b" "c" "d" "e" "f"
我想运行向量并连接两个和三个元素的组。这是我想要的最终结果:
"a b" "b c" "c d" "d e" "e f"
和
"a b c" "b c d" "c d e" "d e f"
我通过使用for循环解决了这个最简单和最脏的方法,但是运行需要很长时间,我相信它可以更有效地完成。
这是我的贫民区:
t1 <- c("a", "b", "c", "d", "e", "f")
t2 <- rep("", length(t1)-1)
for (i in 1:length(t1)-1) {
t2[i] = paste(t1[i], t1[i+1])
}
t3 <- rep("", length(t1)-2)
for (i in 1:length(t1)-2) {
t3[i] = paste(t1[i], t1[i+1], t1[i+2])
}
我正在调查sapply和tapply等,但我似乎无法弄清楚如何使用&#34;以下元素&#34;在向量中。
任何帮助都会得到我永恒的感激之情!
--------------编辑--------------
使用大约300万行的输入数据运行建议的次数:
START: [1] "2016-11-20 19:24:50 CET" For-loop: [1] "2016-11-20 19:28:26 CET" rollapply: [1] "2016-11-20 19:38:55 CET" apply(matrix): [1] "2016-11-20 19:42:15 CET" paste t1[-length...]: [1] "2016-11-20 19:42:37 CET" grep: [1] "2016-11-20 19:44:30 CET"
答案 0 :(得分:2)
你考虑过动物园套餐吗?例如
library('zoo')
input<-c('a','b','c','d','e','f')
output<-rollapply(data=input, width=2, FUN=paste, collapse=" ")
output
将返回
"a b" "b c" "c d" "d e" "e f"
width
参数控制要连接的元素数。我希望你在这里也有改进的运行时间,但我还没有经过测试
答案 1 :(得分:1)
对于两人一组,我们可以使用
执行此操作paste(t1[-length(t1)], t1[-1])
#[1] "a b" "b c" "c d" "d e" "e f"
对于更高的数字,一个选项是来自shift
data.table
library(data.table)
v1 <- do.call(paste, shift(t1, 0:2, type="lead"))
grep("NA", v1, invert=TRUE, value=TRUE)
#[1] "a b c" "b c d" "c d e" "d e f"
或者
n <- length(t1)
n1 <- 3
apply(matrix(t1, ncol=n1, nrow = n+1)[seq(n-(n1-1)),], 1, paste, collapse=' ')