2016-07-07 22 views
0

ich eine Textdatei-Datensatz, die ich wie folgt lauten:zu viele NA-Werte in Datensatz für na.omit zu handhaben

cancer1 <- read.table("cancer.txt", stringsAsFactors = FALSE, quote='', header=TRUE,sep='\t') 

ich dann die Klasse der konstituierenden Werte umwandeln müssen, damit ich durchführen kann mathematische Analysen zum df.

cancer<-apply(cancer1,2, as.numeric) 

Dies führt> 9000 NA-Werte in eine "17980 X 598" df ein. Daher gibt es zu viele NA-Werte, um einfach "na.omit" zu verwenden, da alle Zeilen entfernt werden.

Daher ist mein Plan, jede NA in jeder Zeile durch den Mittelwert dieser Zeile zu ersetzen wie folgt, mein Versuch:

for(i in rownames(cancer)){ 
    cancer2<-replace(cancer, is.na(cancer), mean(cancer[i,])) 
} 

jedoch entfernt diese jede Zeile wie na.omit:

dim(cancer2) 
[1] 0 598 

Kann mir jemand sagen, wie jeder der NA-Werte mit dem Mittelwert dieser Zeile ersetzen ?

Antwort

2

Sie können rowMeans mit Indexierung verwenden.

k <- which(is.na(cancer1), arr.ind=TRUE) 
cancer1[k] <- rowMeans(cancer1, na.rm=TRUE)[k[,1]] 

Wo k ein Indizes der Zeilen mit NA-Wert ist.

Das funktioniert besser als meine ursprüngliche Antwort, die war:

for(i in 1:nrow(cancer1)){ 
    for(n in 1:ncol(cancer1)){ 
    if(is.na(cancer1[i,n])){ 
     cancer1[i,n] <- mean(t(cancer1[i,]), na.rm = T)# or rowMeans(cancer1[i,], na.rm=T) 
    } 
    } 
} 
+0

Das sieht aus wie wird es funktionieren, aber es gibt ein paar Probleme . (1) Warum "rowMeans" in einer einzelnen Zeile verwenden? (2) warum für jeden fehlenden Wert getrennt berechnen? (3) Sie können fast sicher die innere Schleife vektorisieren, um Effizienz stark zu erhöhen ... –

+0

@BenBolker Ich habe meine Antwort erheblich aktualisiert –

0

es mit dem Code aus verwandter Post angepasst aussortiert:

cancer1 <- read.table("TCGA_BRCA_Agilent_244K_microarray_genomicMatrix.txt", stringsAsFactors = FALSE, quote='' ,header=TRUE,sep='\t') 
t<-cancer1[1:800, 1:400] 
t<-t(t) 
t<-apply(t,2, as.numeric) #constituents read as character strings need to be converted 
            #to numerics 
cM <- rowMeans(t, na.rm=TRUE) #necessary subsequent data cleaning due to the 
            #introduction of >1000 NA values- converted to the mean value of that row 
indx <- which(is.na(t), arr.ind=TRUE) 
t[indx] <- cM[indx[,2]]