向量化排列

问题描述 投票:1回答:1

我有12个对象的数组。每个都是一个字母。我想生成4、5、6、7和8个字母的所有组合。

首先,我只使用gregmisc包生成排列:

sapply(4:8, function(x) permutations(n = 12, r = x)) -> perms

然后,我想获取名为letters.split的对象数组,并创建所有组合。所以我去:

unlist(lapply(perms, a <- function (x){
        apply(x, 1, function(y) letters.split[y])
    })) -> combos

似乎在计算上效率低下。必须有更好的方法在索引处使用置换组合。排列功能并不是真正困扰我的事情,因为我只需要这样做,然后我就可以保存它。

[我想问一下是否有矢量化的方法,但是我实际上不知道这意味着什么,所以用简单的术语简单解释一下矢量化的功能将不胜感激。

r vectorization permutation
1个回答
0
投票

回答去Vincent Zoonekynd。

第二步看起来似乎没有必要:permutations程序包的vegan函数具有一个v参数,该参数可以直接置换您的数据,而不必考虑索引:

x <- lapply(2:3, permutations, n = 3, v = LETTERS[1:12])

输出:

[[1]]
     [,1] [,2]
[1,] "A"  "B" 
[2,] "A"  "C" 
[3,] "B"  "A" 
[4,] "B"  "C" 
[5,] "C"  "A" 
[6,] "C"  "B" 

[[2]]
     [,1] [,2] [,3]
[1,] "A"  "B"  "C" 
[2,] "A"  "C"  "B" 
[3,] "B"  "A"  "C" 
[4,] "B"  "C"  "A" 
[5,] "C"  "A"  "B" 
[6,] "C"  "B"  "A" 

II。向量化函数是将向量作为集合的函数。通常(尤其是在其他语言,例如C语言中),您的函数将单个值作为参数,因此您必须使用for循环在数组中循环。

例如:

计算数字数组的log10--1、10、100、1000。

非矢量化方法(类似C的样式:):

x <- c(1, 10, 100, 1000)
for(i in 1:4) {
  print(log10(x[i]))
}

# [1] 0
# [1] 1
# [1] 2
# [1] 3

矢量化方法。由于log10是矢量化函数,因此可以将其与vector一起使用。

x <- 10 
log10(x)
# [1] 0 1 2 3
© www.soinside.com 2019 - 2024. All rights reserved.