簡體   English   中英

當任何值大於,等於或小於閾值時,從R中的矩陣中刪除列

[英]Removing Columns from a Matrix in R when Any Value Is Greater, Equal or Less Than Threshold

我正在玩虛構的骰子 - 其中兩個 - 並希望產生所有可能的排列以加起來一定的值,比如'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()返回的矩陣中消除值大於'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

您可以簡單地使用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

構造正確的集合比過濾錯誤的集合更清晰(根據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

我首先檢查列中的任何值是否包含任何大於閾值的值,然后查看是否有任何雙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

@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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM