Frage Datenrahmen und is.nan ()


Ich benutzte sum(is.na(my.df)) zu überprüfen, ob mein Datenrahmen irgendwelche NAs enthielt, die wie erwartet funktionierten, aber sum(is.nan(my.df)) hat nicht so funktioniert, wie ich es erwartet hatte.

> my.df <- data.frame(a=c(1, 2, 3), b=c(5, NA, NaN))
> my.df
  a   b
1 1   5
2 2  NA
3 3 NaN
> is.na(my.df)
         a     b
[1,] FALSE FALSE
[2,] FALSE  TRUE
[3,] FALSE  TRUE
> is.nan(my.df)
    a     b 
FALSE FALSE 
> sum(is.na(my.df))
[1] 2
> sum(is.nan(my.df))
[1] 0

Ach je. Gibt es einen Grund für die Inkonsistenz im Verhalten? Liegt es an einem Mangel an Implementierung oder ist es beabsichtigt? Was bedeutet der Rückgabewert von is.nan(my.df) bedeuten? Gibt es einen guten Grund, nicht zu verwenden is.nan() auf einem ganzen Datenrahmen?

In der Dokumentation für is.na( ) und is.nan( ), die Argumenttypen scheinen die gleichen zu sein (obwohl sie Datenrahmen nicht speziell auflisten):

is.na(): x R zu testendes Objekt: Die Standardmethoden behandeln atomare Vektoren, Listen und Parallelisten. is.nan(): x R zu testendes Objekt: Die Standardmethoden behandeln atomare Vektoren, Listen und Parallelisten.


14
2017-08-11 18:42


Ursprung


Antworten:


Von ?is.nan:

All elements of logical,integer and raw vectors are considered not to be NaN, and
elements of lists and pairlists are also unless the element is a length-one numeric
or complex vector whose single element is NaN.

Die Spalten eines Datenrahmens sind technisch "Elemente einer Liste", also is.nan(df) gibt einen Vektor mit der Länge zurück, die gleich der Anzahl der Spalten des Datenrahmens ist TRUE nur wenn die Spalte aus einem einzigen besteht NaN Element:

> is.nan(data.frame(a=NaN,b=NA,c=1))
    a     b     c 
 TRUE FALSE FALSE 

Wenn Sie ein Verhalten haben wollen, das dem von is.na, benutzen apply:

sum(apply(my.df,2,is.nan))

Die Antwort ist 1 und nicht 2 is.nan(NA) ist FALSE ...

bearbeiten: alternativ können Sie einfach den Datenrahmen in eine Matrix verwandeln:

 sum(is.nan(as.matrix(my.df)))

aktualisieren: Dieses Verhalten änderte sich kurz (zwei Monate) nachdem die Frage gestellt wurde, in R Version 2.14 (Oktober 2011): von der Nachrichtendatei,

o Die Standardmethoden für is.finite (), is.infinite () und is.nan () signalisieren jetzt einen Fehler, wenn ihr Argument kein atomarer Vektor ist.


16
2017-08-11 18:57