2016-05-01 5 views
3

を見つけて削除し、私はこれまでのところ、私は完全に使用してNASを充填した行と列を削除したこの5%以上欠けているデータを持つ行

 id1 id2 id3 id4 id5 id6 id7 id8 id9 
snp1 1 2 0 NA 1 1 1 2 1 
snp2 2 2 2 2 0 2 NA NA 0 
snp3 NA NA 1 NA 0 NA NA 2 2 

のように見えます(結果と呼ばれる)行列を持っています

indexsnp=apply(results,1, 
function(x) length(which(is.na(x)==T))) 
indexsnp=which(indexsnp==length(results[1,])) 
indexsample=apply(results,2, 
function(x) length(which(is.na(x)==T))) 
indexsample=which(indexsample==length(results[,1])) 

#get rid of indexes 
results=results[-indexsnp,] 
results=results[,-indexsample] 

私はまだ(行が5%以上のNAで構成されている)ので、今、私は95%以下で通話料金を持っているSNPかを確認したいと思い、私のデータセットでは、NASの多くを持っているし、それらを削除します行。私はこれを行う方法がわかりません。私は

snpsum.col <- col.summary(results) 
library(snpStats) 
call <- 0.95 
use <- with(snpsum.col, (!is.na(Call.rate) & Call.rate >= call)) 
use[is.na(use)] <- FALSE    
cat(ncol(results)-sum(use),"SNPs will be removed due to low call 
rate.\n") 
genotype <- genotype[,use] 
snpsum.col <- snpsum.col[use,] 

を試してみましたが、私はエラー

Error in col.summary(results) : not a SnpMatrix object 

が、私はこれを行うことができます別の方法があり得ますか?

+1

は、これは単なる '結果[rowSums(is.na(結果))<(NcoI部位(結果)* 0.05)、]'はありませんか? 'NA'で完全に埋められた行を削除するためのコードも非常に非効率で不要です。 'na.omit'または' complete.cases'を使用するだけです。 –

+0

@DavidArenburgは、そうしたやり方で削除された行(または、どれくらい)があるかを知る方法はありますか? –

+3

'(rowSums(is.na(結果))>(ncol(結果)* .05))'です。もしあなたが "どれくらい"知りたいのであれば、それを 'sum'にまとめてください。質問の最初の部分は[this](http://stackoverflow.com/questions/4862178/remestrowrow-with-nas-in-data-frame)を参照してください。 –

答えて

1

mは、このような行列である場合には、やる

m <- m[is.na(m)%*%rep(1,ncol(m))<=ncol(m)*0.05,] 
関連する問題