R - 使用outer()和expand.grid()的组合列表

时间:2013-11-26 21:39:11

标签: r

我有一个素数列表,我使用outer()upper.tri()乘以得到一组唯一的数字。

primes <- c(2, 3, 5, 7, 11, 13, 17, 19, 23, 29)
m <- outer(primes, primes, "*")
unq <- m[which(upper.tri(m))]

> unq
6  10  15  14  21  35  22  33  55  77  26  39  65  91 143  34  51  85 119 187 221  38  57  95 133 209 247 323  46  69 115 161 253 299 391 437 58  87 145 203 319 377 493 551 667

每个原始素数代表一组两个数字:

a2 <- c(1,1)
a3 <- c(1,2)
a5 <- c(2,2)
a7 <- c(1,3)
a11 <- c(1,4)
a13 <- c(2,3)
a17 <- c(2,4)
a19 <- c(3,3)
a23 <- c(3,4)
a29 <- c(4,4)

两组两个数字的组合产生4个数字

expand.grid(a2,a3)

1    1
1    1
1    2
1    2

所以我想做的是有一个列表列表,每个素数都有4种可能的组合。 我试过这样的事情,但我在这里错过了一些基本原则:

outer(a ,a , "expand.grid")

所以第一个素数的结果看起来像这样:

   6 c(11, 11, 12, 12)

1 个答案:

答案 0 :(得分:2)

我不确定我是否理解正确,但我希望这会有所帮助:

#function to `outer`
fun <- function(x, y) 
{ 
 a1 <- get(paste0("a", x))
 a2 <- get(paste0("a", y))
 res <- apply(expand.grid(a1, a2), 1, paste, collapse = "")
 res2 <- paste(res, collapse = ";")

 return(res2)
}

#`outer` a vectorized `fun`
m2 <- outer(primes, primes, Vectorize(fun))
#select `upper.tri`
unq2 <- m2[upper.tri(m2)]

#combine to a list
myls <- lapply(as.list(unq2), function(x) as.numeric(unlist(strsplit(x, ";"))))
names(myls) <- unq

myls
#$`6`
#[1] 11 11 12 12

#$`10`
#[1] 12 12 12 12

#$`15`
#[1] 12 22 12 22

#$`14`
#[1] 11 11 13 13
#...