2013-07-03 118 views
1

我有一個類似於下面的矩陣,我需要刪除列中的所有行都是1:10或列11:20。因此,例如在我的數據中,應該刪除第8行,因爲1:10列中的所有值都是零。 我有這樣的代碼,但它不工作:如何刪除在某些列中包含零的矩陣行R

> dput(mat) 
structure(c(6L, 645L, 897L, 13L, 278L, 384L, 200L, 0L, 0L, 133L, 
8L, 415L, 685L, 7L, 208L, 239L, 150L, 0L, 2L, 85L, 7L, 600L, 
850L, 17L, 337L, 358L, 172L, 0L, 0L, 150L, 0L, 341L, 396L, 7L, 
252L, 222L, 88L, 0L, 0L, 84L, 6L, 799L, 978L, 24L, 534L, 464L, 
156L, 0L, 0L, 216L, 5L, 306L, 418L, 7L, 238L, 215L, 46L, 0L, 
0L, 109L, 4L, 292L, 378L, 4L, 237L, 159L, 64L, 0L, 0L, 74L, 7L, 
401L, 579L, 8L, 305L, 281L, 107L, 0L, 0L, 133L, 9L, 821L, 854L, 
31L, 525L, 422L, 150L, 0L, 0L, 182L, 5L, 796L, 980L, 25L, 519L, 
491L, 148L, 0L, 0L, 213L, 3L, 580L, 753L, 11L, 246L, 299L, 166L, 
0L, 1L, 102L, 5L, 364L, 503L, 14L, 201L, 244L, 115L, 0L, 0L, 
67L, 7L, 406L, 670L, 13L, 258L, 227L, 139L, 0L, 0L, 102L, 7L, 
846L, 998L, 16L, 440L, 444L, 170L, 0L, 1L, 233L, 6L, 574L, 630L, 
6L, 211L, 231L, 132L, 0L, 0L, 107L, 15L, 866L, 1074L, 35L, 535L, 
507L, 188L, 0L, 1L, 193L, 8L, 817L, 1078L, 31L, 493L, 532L, 183L, 
0L, 0L, 258L, 8L, 426L, 635L, 17L, 354L, 282L, 120L, 0L, 0L, 
134L, 3L, 432L, 597L, 6L, 197L, 230L, 133L, 1L, 0L, 95L, 10L, 
493L, 727L, 30L, 425L, 341L, 151L, 0L, 0L, 133L), .Dim = c(10L, 
20L), .Dimnames = list(c("1", "2", "3", "4", "5", "6", "7", "8", 
"9", "10"), c("V2", "V3", "V4", "V5", "V6", "V7", "V8", "V9", 
"V10", "V11", "V12", "V13", "V14", "V15", "V16", "V17", "V18", 
"V19", "V20", "V21"))) 

test <- apply(mat, 1,function(row)all(mat[row,1:10]==0) || all(mat[row,11:20]==0)) 
mat <- mat[!test,] 

回答

4

apply按行越過矩陣行。使用這個來代替:

test <- apply(mat, 1,function(x) all(x[1:10]==0) | all(x[11:20]==0)) 
+2

爲了讓您的新的矩陣在一個命令:'do.call(rbind,應用(墊,1,功能(R)如果(!(all(r [1:10] == 0)| all(r [11:20] == 0)))r))' – user1981275

+0

謝謝我錯誤地使用apply! – hora

4

你不需要apply

mat[rowSums(abs(mat[,1:10]))>0 & rowSums(abs(mat[,11:20]))>0,] 
+3

這對「mat」中的值做了一些假設。 – Roland

+0

@Roland你能說更多嗎? – Thomas

+0

那麼,你有沒有考慮負面價值? – Roland

相關問題