2017-08-31 1 views
0

In der if_else() Funktion in dplyr, it requires that both the if:TRUE and if:FALSE elements are of the same class.Spezifizieren Sie die Klasse der NA in R (für if_else, dplyr)

Ich möchte NA von meiner if_else() Anweisung zurückgeben.

Aber z.B.

if_else(mtcars$cyl > 5, NA, 1) 

kehrt

Error: false has type 'double' not 'logical'

Weil einfach in NA ist logisch, zu lesen, und 1 numerisch ist (double).

Wrapping as.numeric() um die NA funktioniert gut: z.B.

if_else(mtcars$cyl > 5, as.numeric(NA), 1) 

kehrt

1 NA NA 1 NA NA NA NA 1 1 NA NA NA NA NA NA NA NA 1 1 1 1 NA NA NA NA 1 1 1 NA NA NA 1

Als was ich hoffe.

Aber das fühlt sich irgendwie dumm/unnötig. Gibt es eine bessere Möglichkeit, NA als "numerisch NA" einzugeben, als es so zu verpacken?

Hinweis: Dies gilt nur für den strengeren dplyr::if_else nicht base::ifelse.

+0

Alle Elemente in einem Atomvektor vom gleichen Typ sein müssen. NA ist standardmäßig logisch. Die Hadley-Funktion muss vor dem Ausführen nach dem gleichen Datentyp suchen, aber die Basis-R-Funktion erzwingt einfach die NA, um mit dem anderen Argument übereinzustimmen. Siehe die Hilfeseite '?" NA "für ein besseres Verständnis dessen, was mit der NA passiert. Überprüfen Sie auch die Ausgabe von 'ifelse (mtcars $ cyl> 5," this ", 1)'. – lmo

Antwort

3

können Sie verwenden NA_real_

if_else(mtcars$cyl > 5, NA_real_, 1) 
2

versuchen, die Funktion Basis

ifelse(mtcars$cyl > 5, NA, 1) 
+0

Ja, ich weiß, danke, siehe bearbeiten, ich bin mehr daran interessiert, dieses Verhalten zu verstehen, anstatt mich darum zu kümmern. –

Verwandte Themen