连接矢量字符元素组

时间:2016-11-20 17:31:53

标签: r

我不知道此类操作的正确技术术语,因此很难搜索现有的解决方案。我想我会尝试发表自己的问题,希望有人可以帮助我(或指出我正确的方向)。

我有一个字符矢量,我想以三三两组的形式收集它们。为了说明,这是一个简化版本:

我的表格:

"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"

2 个答案:

答案 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=' ')