Sam*_*per 6 sorting combinations r permutation
我希望创建一个包含两个不同值的向量的所有可能排列,在其中我控制每个值的比例。
例如,如果我有一个长度为三的向量,并且我希望所有可能的组合都包含一个单一的1,那么我想要的输出就是一个看起来像这样的列表:
list.1 <- list(c(1,0,0), c(0,1,0), c(0,0,1))
Run Code Online (Sandbox Code Playgroud)
相反,如果我希望所有可能的组合包含三个1,那么我想要的输出是一个看起来像这样的列表:
list.3 <- list(c(1,1,1))
Run Code Online (Sandbox Code Playgroud)
换一种方式,格局1和0物质价值,但所有1S的关系被视为等同于其他所有1秒。
基于此处和其他位置的搜索,我尝试了几种方法:
expand.grid(0:1, 0:1, 0:1) # this includes all possible combinations of 1, 2, or 3 ones
permn(c(0,1,1)) # this does not treat the ones as identical (e.g. it produces (0,1,1) twice)
unique(permn(c(0,1,1))) # this does the job!
Run Code Online (Sandbox Code Playgroud)
因此,使用permn软件包中的功能combinat似乎很有希望。但是,在将其扩展到我的实际问题(长度为20的矢量,具有50%1s和50%0s的位置)时,我遇到了问题:
unique(permn(c(rep(1,10), rep(0, 10))))
# returns the error:
Error in vector("list", gamma(n + 1)) :
vector size specified is too large
Run Code Online (Sandbox Code Playgroud)
我的理解是,发生这种情况是因为,在对的调用中permn,它创建了一个包含所有可能排列的列表,即使它们中的许多排列都是相同的,并且此列表太大,R无法处理。
有没有人建议如何解决这个问题?
抱歉,如果以前已经回答过-包含类似语言但存在不同问题的SO问题很多,我无法找到满足我需要的解决方案!
它不应该是一个expand.grid包含所有排列的交易破坏者。只需在之后添加一个子集:
combinations <- function(size, choose) {
d <- do.call("expand.grid", rep(list(0:1), size))
d[rowSums(d) == choose,]
}
combinations(size=10, choose=3)
# Var1 Var2 Var3 Var4 Var5 Var6 Var7 Var8 Var9 Var10
# 8 1 1 1 0 0 0 0 0 0 0
# 12 1 1 0 1 0 0 0 0 0 0
# 14 1 0 1 1 0 0 0 0 0 0
# 15 0 1 1 1 0 0 0 0 0 0
# 20 1 1 0 0 1 0 0 0 0 0
# 22 1 0 1 0 1 0 0 0 0 0
...
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
625 次 |
| 最近记录: |