【问题标题】:extract "N" sized sequences from an array in R从 R 中的数组中提取“N”个大小的序列
【发布时间】:2016-08-18 17:37:29
【问题描述】:

假设我有以下数组:

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

然后假设这些字母按顺序排列,我想从该数组中提取所有可能的“n”大小的序列。例如:

对于n=2 我愿意:paste0(a[1:99],"-&gt;",a[2:100])

对于n=3 我愿意:paste0(a[1:98],"-&gt;",a[2:99],"-&gt;",a[3:100])

你明白了。现在,我的目标是创建一个函数,它将n 作为输入,并从数组a 中返回给定长度的相应序列集

我可以使用循环和所有其他方法来做到这一点,但我希望有一个高性能的单班轮。

我对 R 有点陌生,所以我不知道所有现有的功能。

【问题讨论】:

  • 试试embed(a, n) ... 用一个奇怪的名字来隐藏函数,但似乎正是这样做的。
  • @Frank 我一开始以为它不起作用,但后来我从最后一列开始读取输出,它是正确的,我只需要弄清楚如何从最后一列开始组装每一行到第一个并将它们放入一个数组中
  • 之后可以颠倒列顺序,如embed(a, n)[, n:1]
  • @Frank 巧妙的技巧。我将尝试应用函数分别粘贴所有行,然后将它们移动到平面一维数组中。除非您有更好的解决方案,否则您应该将其发布为答案

标签: arrays r performance subset


【解决方案1】:

您可以使用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)]

shift 就像embed,除了它......

  • 返回一个列表而不是矩阵,所以我们不需要split by col 来粘贴
  • 填充缺失值以保持完整长度,因此我们需要删除-(1:2)

我希望就如何在 R 中找到晦涩的函数说一些有用的东西,但对于如何找到 embed 几乎一无所知。也许……

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

【讨论】:

  • 感谢@David,已添加
猜你喜欢
  • 2023-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多