[英]R: How to drop rows that contain any value less than -4 and greater than 4 on specific columns?
[英]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'的列 。 是的,也是任何帶有零的列。
你可以幫忙,或許應用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
您可以簡單地使用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.