当任何值大于,等于或小于阈值时,从R中的矩阵中删除列

时间:2015-05-21 05:51:25

标签: r matrix subset

我正在玩虚拟骰子 - 其中两个 - 并希望生成所有可能加起来某个值的排列,例如'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'的值。是的,还有任何带有零的列。

您可以提供帮助,或许可以应用allany,或使用括号进行子集化,以便在'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

4 个答案:

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