Arrays 从R中的数组中提取“N”大小的序列
假设我有以下数组:Arrays 从R中的数组中提取“N”大小的序列,arrays,r,performance,subset,Arrays,R,Performance,Subset,假设我有以下数组: a <- sample(letters,100,replace=TRUE) 然后假设这些字母按顺序排列,我想从该数组中提取所有可能的“n”大小的序列。例如: 对于n=2,我会做:粘贴0a[1:99],->,a[2:100] 对于n=3,我会做:粘贴0a[1:98],->,a[2:99],->,a[3:100] 你明白了。现在,我的目标是创建一个函数,将n作为输入,并从数组a返回给定长度的对应序列集 我能够使用循环和所有这些来完成它,但我希望有一个高性能的单行程序 我对
a <- sample(letters,100,replace=TRUE)
然后假设这些字母按顺序排列,我想从该数组中提取所有可能的“n”大小的序列。例如:
对于n=2,我会做:粘贴0a[1:99],->,a[2:100]
对于n=3,我会做:粘贴0a[1:98],->,a[2:99],->,a[3:100]
你明白了。现在,我的目标是创建一个函数,将n作为输入,并从数组a返回给定长度的对应序列集
我能够使用循环和所有这些来完成它,但我希望有一个高性能的单行程序
我对R有点陌生,所以我不知道所有现有的函数。您可以使用嵌入。对于embeda,3,这给出了一个包含列的矩阵
a[3:100]
a[2:99]
a[1:98]
按这个顺序
要反转列顺序,请使用矩阵语法m[rows,cols]:
如果希望在列之间打印箭头,则
do.call(paste, c(split(res, col(res)), sep = " -> "))
这是一种方法。这可能比applyres,1,something,在性能方面更好,因为这是矢量化的,而apply将在行上循环
正如@DavidArenburg所指出的,这同样可以通过data.table实现:
library(data.table)
do.call(paste, c(shift(a, 2:0), sep = " -> "))[-(1:2)]
shift就像嵌入,只是它
返回一个列表而不是一个矩阵,因此我们不需要按列拆分来粘贴
缺少值的焊盘可以保持全长,因此我们需要以-1:2的比例下降
我本想说一些关于如何在R中找到模糊函数的有用信息,但对于如何找到嵌入,我几乎一无所知。也许
转到任何HTML帮助页面
单击底部的索引超链接
阅读每一页
? 您可以使用嵌入。对于embeda,3,这给出了一个包含列的矩阵
a[3:100]
a[2:99]
a[1:98]
按这个顺序
要反转列顺序,请使用矩阵语法m[rows,cols]:
如果希望在列之间打印箭头,则
do.call(paste, c(split(res, col(res)), sep = " -> "))
这是一种方法。这可能比applyres,1,something,在性能方面更好,因为这是矢量化的,而apply将在行上循环
正如@DavidArenburg所指出的,这同样可以通过data.table实现:
library(data.table)
do.call(paste, c(shift(a, 2:0), sep = " -> "))[-(1:2)]
shift就像嵌入,只是它
返回一个列表而不是一个矩阵,因此我们不需要按列拆分来粘贴
缺少值的焊盘可以保持全长,因此我们需要以-1:2的比例下降
我本想说一些关于如何在R中找到模糊函数的有用信息,但对于如何找到嵌入,我几乎一无所知。也许
转到任何HTML帮助页面
单击底部的索引超链接
阅读每一页
? 试试看。。。用一个奇怪的名字来模糊函数,但似乎正是这样做的。@Frank我起初以为它不工作,但后来我从最后一列开始阅读输出,结果是正确的,我只需要找出如何从最后一列到第一列组装每一行,并将它们放在一个阵列中。之后,您可以颠倒列顺序,如embeda,n[,n:1]@Frank。我将尝试使用apply函数分别粘贴所有行,然后将它们移动到平面1D数组中。除非你有更好的解决方案,否则你应该把它作为一个答案。。。用一个奇怪的名字来模糊函数,但似乎正是这样做的。@Frank我起初以为它不工作,但后来我从最后一列开始阅读输出,结果是正确的,我只需要找出如何从最后一列到第一列组装每一行,并将它们放在一个阵列中。之后,您可以颠倒列顺序,如embeda,n[,n:1]@Frank。我将尝试使用apply函数分别粘贴所有行,然后将它们移动到平面1D数组中。除非你有更好的解决方案,否则你应该把它作为回答发帖谢谢@David,hanks@David补充道