R:矢量化排列

时间:2012-01-22 02:21:00

标签: r

我有一个包含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

看起来计算效率很低。需要一段时间。必须有更好的方法在索引处使用置换组合。排列功能实际上并不困扰我,因为我只需要这样做然后我就可以保存它。

我想问一下是否有这样做的矢量化方法,但我实际上并不知道这意味着我只是一直听到它,所以简单地解释一下矢量化函数是什么和我一起走很远的路!

谢谢!

1 个答案:

答案 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