R 矢量字符元素的串联组

R 矢量字符元素的串联组,r,R,我不知道这种操作的合适技术术语,因此很难找到现有的解决方案。我想我会试着提出我自己的问题,希望有人能帮我解决(或者给我指出正确的方向) 我有一个向量的字符,我想收集他们在两组和三组。为了举例说明,以下是一个简化版本: 我的表格如下: "a" "b" "c" "d" "e" "f" “a” “b” “c” “d” “e” “f” 我想遍历向量并连接两个和三个元素的组。这就是我想要的最终结果: "a b" "b c" "c d" "d e" "e f" “a b” “b c” “c d” “d e”

我不知道这种操作的合适技术术语,因此很难找到现有的解决方案。我想我会试着提出我自己的问题,希望有人能帮我解决(或者给我指出正确的方向)

我有一个向量的字符,我想收集他们在两组和三组。为了举例说明,以下是一个简化版本:

我的表格如下:

"a" "b" "c" "d" "e" "f" “a” “b” “c” “d” “e” “f” 我想遍历向量并连接两个和三个元素的组。这就是我想要的最终结果:

"a b" "b c" "c d" "d e" "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])
}

t1对于两人一组,我们可以用

paste(t1[-length(t1)], t1[-1])
#[1] "a b" "b c" "c d" "d e" "e f"
对于较大的数字,一个选项是从
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"
库(data.table)

v1你考虑过动物园套餐吗?比如说

library('zoo')
input<-c('a','b','c','d','e','f')
output<-rollapply(data=input, width=2, FUN=paste, collapse=" ")
output

width
参数控制要连接的元素数量。我希望您在这里也能改进运行时,但我还没有测试过

谢谢!我测试了所有三种解决方案。我的输入向量有大约300万个元素,我的for循环花费了大约4分钟。您的第一个解决方案非常高效,只需20秒。其次是grep解决方案。apply(matrix)解决方案花费的时间与for循环差不多。我正在使用您的第一个版本。@code>第三个版本的速度变慢,因为
apply
基本上类似于
for
循环。您可以转换为
data.frame
并使用
do.call(粘贴,如.data.frame(矩阵(t1,….
看来我欠你一个道歉:当我运行测试时,我没有使用n1。谢谢你的建议!我的输入向量大约有300万行,你的解决方案花了大约10分钟,而for循环则花了大约4分钟。你的建议很优雅,但看起来zoo开发人员需要做一些优化。:)
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=' ')
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"