我有一个包含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
看起来计算效率很低。需要一段时间。必须有更好的方法在索引处使用置换组合。排列功能实际上并不困扰我,因为我只需要这样做然后我就可以保存它。
我想问一下是否有这样做的矢量化方法,但我实际上并不知道这意味着我只是一直听到它,所以简单地解释一下矢量化函数是什么和我一起走很远的路!
谢谢!
答案 0 :(得分: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