我正在玩虚拟骰子 - 其中两个 - 并希望生成所有可能加起来某个值的排列,例如'9'。我们有 {3,6} , {4,5} , {5,4} 和 {6,3} 。但是我想扩展它,我需要一些代码。
如果我想知道添加到'6'的排列,可以这样做:
library(partitions)
compositions(6, m = 2)
[1,] 6 5 4 3 2 1 0
[2,] 0 1 2 3 4 5 6
这会给我几乎我需要的东西 - 我们扔两个骰子,所以不会有任何零可能......我稍后会再回来......
不幸的是,当你超越'6'时,你开始得到数字大于'6'的作文,这些作文在骰子的两侧找不到。因此,我必须从compositions()
ANY返回的矩阵中消除值大于'6'的值。是的,还有任何带有零的列。
您可以提供帮助,或许可以应用all
或any
,或使用括号进行子集化,以便在'9的情况下提供一种简短,优雅的方法来消除不需要的列'(或其他示例> 6 ):
compositions(9,2)
[1,] 9 8 7 6 5 4 3 2 1 0
[2,] 0 1 2 3 4 5 6 7 8 9
答案 0 :(得分:2)
构造正确的集合比过滤错误的集合更清晰(按照OP的要求):
twodice <- function(x){d1 <- if (x>6) 6:(x-6) else 1:(x-1); rbind(d1,rev(d1))}
示例:
> twodice(4)
[,1] [,2] [,3]
d1 1 2 3
3 2 1
> twodice(9)
[,1] [,2] [,3] [,4]
d1 6 5 4 3
3 4 5 6
答案 1 :(得分:1)
你可以简单地使用如下的apply函数:
ans <- compositions(9, m = 2)
ans[,apply(ans,2,function(x) all(x<=6))]
带输出:
[,1] [,2] [,3] [,4]
[1,] 6 5 4 3
[2,] 3 4 5 6
或者,您可以使用dplyr
,它看起来更干净,可能更直观:
library(dplyr)
expand.grid(d1=1:6, d2=1:6) %>% filter(d1+d2 == 9)
输出:
d1 d2
1 6 3
2 5 4
3 4 5
4 3 6
或使用上面的ans
:
data.frame(as.matrix(t(ans))) %>% filter(X1 <= 6 & X2 <= 6)
输出:
X1 X2
1 6 3
2 5 4
3 4 5
4 3 6
答案 2 :(得分:0)
我首先检查列中的任何值是否包含任何大于阈值的值,然后查看是否有任何双FALSE。
above.th <- apply(
apply(x, MARGIN = 2, FUN = function(m) m > 6),
MARGIN = 2,
any)
x[, !above.th]
And I get this result
[,1] [,2] [,3] [,4]
[1,] 6 5 4 3
[2,] 3 4 5 6
答案 3 :(得分:0)
@chappers有一个非常好的,简短的解决方案,我将跟进他的回答。实际上,在同一时间,我得到了以下,这似乎运作良好,并且非常相似:
a <- compositions(9,2)
a[,which(!apply(a, 2, function(x){any(x > 6) + any(x == 0)}))]
[,1] [,2] [,3] [,4]
[1,] 6 5 4 3
[2,] 3 4 5 6