我有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
似乎在计算上效率低下。必须有更好的方法在索引处使用置换组合。排列功能并不是真正困扰我的事情,因为我只需要这样做,然后我就可以保存它。
[我想问一下是否有矢量化的方法,但是我实际上不知道这意味着什么,所以用简单的术语简单解释一下矢量化的功能将不胜感激。
回答去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