2013-03-22 55 views
1

我有一個按行排列在不同列中的值矩陣。 我想我的代碼做:根據列的百分比檢查列值並打印/刪除滿足條件的行

  1. 遍歷行 - >檢查是否列<閾值(例如1)
  2. 中的行,如果有說80%列滿足該條件,保持行;否則刪除整行。

到目前爲止的代碼:

myfilt <- function(t,x){ 
      if ((length(which(t[x,] > 1))/60) >= 0.8){ 
       return(1) 
      }else{ 
       return(0) 
      } 
      } 

y=c() 
for(i in 1:length(t[,1])){ 
    y = c(y,myfilt(t,i)) 
} 

但是當我打印t[v,]所有行具有相同的值:( 不知道我做錯了,另外,如果有一個較短的方式做到這一點,讓我知道

PS:這裏「T」是矩陣的我測試

回答

2

這裏的名字是一個辦法做到這一點:

## Parameters 
threshold <- 0.8 
perc.to.keep <- 0.5 
## Example Matrix 
set.seed(1337) 
m <- matrix(rnorm(25,1,1),nrow=5,ncol=5) 

#   [,1]  [,2]  [,3]  [,4]  [,5] 
# [1,] 1.7122837 0.8383025 -0.02718379 2.2157099 2.1291008 
# [2,] 0.2462742 2.4602621 -0.04117532 -0.6214087 1.4501467 
# [3,] 1.0381899 3.0094584 0.12937698 0.9314247 1.0505864 
# [4,] 2.1784211 0.9220618 1.85313022 0.9370171 0.8756698 
# [5,] 0.8467962 2.3543421 0.37723981 2.0757077 1.9120115 

test <- m < threshold 
sel <- apply(test,1,function(v) sum(v)/length(v)) < perc 
m[sel,] 

#   [,1]  [,2]  [,3]  [,4]  [,5] 
# [1,] 1.7122837 0.8383025 -0.02718379 2.2157099 2.1291008 
# [2,] 1.0381899 3.0094584 0.12937698 0.9314247 1.0505864 
# [3,] 2.1784211 0.9220618 1.85313022 0.9370171 0.8756698 
# [4,] 0.8467962 2.3543421 0.37723981 2.0757077 1.9120115