提取物" N"来自R中的数组的大小序列

时间:2016-08-18 17:37:29

标签: arrays r performance subset

假设我有以下数组:

a <- sample(letters,100,replace=TRUE)

然后假设这些字母按顺序排列,我想提取所有可能的&#39; n&#39;来自该数组的大小序列。例如:

对于n=2,我会这样做:paste0(a[1:99],"->",a[2:100])

n=3我愿意:paste0(a[1:98],"->",a[2:99],"->",a[3:100])

你明白了。现在,我的目标是创建一个函数,该函数将作为输入n,并将从数组a

返回给定长度的相应序列集。

我能够使用循环和所有这些,但我希望有一个高性能的单线。

我对R有点新,所以我不知道所有现有功能。

1 个答案:

答案 0 :(得分:3)

您可以使用embed。对于embed(a, 3),这会给出一个带

列的矩阵
  • a[3:100]
  • a[2:99]
  • a[1:98]

按此顺序。

要反转列顺序,请使用矩阵语法m[rows, cols]

res = embed(a, 3)[, 3:1]

如果您希望在列之间打印箭头,那么

do.call(paste, c(split(res, col(res)), sep = " -> "))

是一种方式。这可能比性能方面的apply(res, 1, something)更好,因为这是向量化的,而apply会在行上循环。

正如@DavidArenburg所指出的,这可以用data.table:

来完成
library(data.table)
do.call(paste, c(shift(a, 2:0), sep = " -> "))[-(1:2)]

shiftembed类似,但不包括......

  • 返回列表而不是矩阵,因此我们不需要split col来粘贴
  • 填充缺失值以保持全长,因此我们需要使用-(1:2)

我希望能说一些有关如何在R中找到晦涩功能的有用信息,但对于如何找到embed几乎是空白的。也许...

  1. 转到任何HTML帮助页面
  2. 点击&#34;索引&#34;底部的超链接
  3. 阅读每一页