2016-04-27 6 views
0

Ich analysiere Microarray-Daten aus einer öffentlich verfügbaren Datenbank, und meine Ausgabe ist eine Log-Ratio-Matrix, die experimentelle Daten mit Kontrollen vergleicht. Ich habe entdeckt, dass eine meiner Spalten mit NaN Werten belegt ist, da diese Behandlung keine entsprechende Kontrolle hat. Meine Daten Rahmens (fc_initial) Abmessungen 9049 x 647.Fehlerhafte logische Antwort von is.nan

> dim(fc_initial) 
[1] 9049 647 

die Spalte, die

von NaN wird der 580. Spalte gefüllt wird
head(fc_initial[,580]) 
# [1] NaN NaN NaN NaN NaN NaN 

summary(is.nan(fc_initial[,580])) 
# Mode TRUE NA's 
# logical 9049  0 

Wenn ich versuche, diese apply, R mit für alle Spalten zu untersuchen gibt falsch alle FALSE für diese Spalte zurück.

fc_num <- apply(fc_initial, 2, is.nan) 
summary(fc_num[ ,580]) 
# Mode FALSE NA's 
# logical 9049  0 

Ich habe visuell dies mit Blick sowohl bestätigt für fc_initial und fc_num, und ich habe überprüft, doppelt, dass ich für die rechte Spalte suchen which() verwenden.

which(fc_num, arr.ind = TRUE) 
# row col 

which lieferte keine als TRUE zeigt Zellen.

Was fehlt mir? Warum gibt R eine Spalte von FALSE für eine Spalte von Werten zurück, die ich visuell als TRUE bestätigt habe?

+4

Wenn 'fc_initial' ist in der Tat ein data.frame, können Sie davon profitieren, lesen _sehr sorgfältig_ den ersten Satz der Details Abschnitt von "anwenden" und dann darüber nachdenken, ob 'fc_initial' eine Mischung aus Zeichen/Faktor/numerische Spalten hat. (d. h. "sapply" und nicht "apply" beachten). – joran

+0

Vielen Dank für Ihren Kommentar. Die erste Spalte des Datenrahmens ist eine Liste von Sonden als Zeichen, die das Verhalten hervorruft, auf das Sie hingewiesen haben. 'sapply' behebt das Problem und ich werde das für die Zukunft wissen. – scsuarez

Antwort

0

Beim Aufruf apply wird der Datenrahmen zu einer Matrix gezwungen. Wenn es irgendwelche Zeichenspalte sind, wird der gesamte Datenrahmen auf eine Zeichenmatrix dazu gezwungen und alle NaN umgewandelt werden NA

df_1 <- data.frame(a=c("a","b","c"), b=c(NaN, NaN,NaN)) 
df_2 <- data.frame(a=c(1,2,3), b=c(NaN, NaN,NaN)) 

as.matrix(df_1) 

    a b 
[1,] "a" NA 
[2,] "b" NA 
[3,] "c" NA 

as.matrix(df_2) 
    a b 
[1,] 1 NaN 
[2,] 2 NaN 
[3,] 3 NaN 
0

Improvisieren auf @cactusWoman und @joran Kommentar:

## this gives count of nan's by column for your data.frame 
sapply(fc_initial, function(y) sum(length(which(is.nan(y)))))