2016-05-01 14 views
3

ich eine Matrix habe (so genannte Ergebnisse), die wie diese bisherfinden und Löschen von Zeilen, die mehr als 5% fehlende Daten haben

 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 

aussieht, habe ich gelöschten Zeilen und Spalten, die vollständig gefüllt wurden mit NAs mit

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] 

ich noch viel NAs in meinem Dataset haben, so jetzt würde ich gerne sehen, welche Tarife für Gespräche haben unter 95% SNPs (dh die Reihen von mehr als 5% NAs bestehen), und dann diejenigen löschen Reihen. Ich bin mir nicht sicher, wie ich das machen soll. Ich habe versucht,

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,] 

aber ich habe den Fehler

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

Gibt es eine andere Art und Weise kann ich dies tun?

+1

Ist das nicht nur 'Ergebnisse [rowSums (is.na (Ergebnisse)) <(ncol (Ergebnisse) * .05),]'? Ihr Code zum Entfernen von Zeilen, die vollständig mit "NA" gefüllt sind, ist ebenfalls sehr ineffizient und unnötig. Verwenden Sie einfach 'na.omit' oder' complete.cases' –

+0

@DavidArenburg gibt es eine Möglichkeit zu sehen, welche Zeilen (oder wie viele) gelöscht wurden, wenn ich es so mache? –

+3

'was (rowSums (is.na (ergebnisse))> (ncol (ergebnisse) * .05))'. Oder fassen Sie es in "Summe" zusammen, wenn Sie wissen möchten, "wie viele". Und siehe [this] (http://stackoverflow.com/questions/4862178/remove-rows-with-nas-in-data-frame) für den ersten Teil der Frage –

Antwort

1

Wenn m ist eine solche Matrix, tun

m <- m[is.na(m)%*%rep(1,ncol(m))<=ncol(m)*0.05,]