2012-05-25 7 views
11

Un fragmento de código:¿Cómo funciona R's ifelse con los datos de caracteres?

blarg = data.frame(a=c("aa", "bb", "dd")) 
blarg$b = blarg$a 
# blarg$b is now c("aa", "bb", "dd") 
blarg$b = ifelse(blarg$a!="bb",blarg$a,"ZZZ") 
# blarg$b is now c(1, "ZZZ", 3) 
# I expected c("aa", "ZZZ", "dd") 
# typeof(blarg$b) is "character" 

¿Por qué es blarg $ b c (1, "ZZZ", 3)? ¿De dónde vienen los números?

+0

R ha hecho 'blarg $ a' en un factor. Podría intentar 'stringsAsFactors = FALSE' –

+0

No me importa que sea un factor. ¿Cómo puedo obtener el mismo factor para salir de ifelse? – dfrankow

+1

Podrías lanzar 'blarg $ a' al caracter:' ifelse (blarg $ a! = "Bb", as.character (blarg $ a), "ZZZ") 'da' c ("aa", "ZZZ", "dd") ' –

Respuesta

11

+1 para usar un data.frame llamado blarg.

Para ampliar lo que dijo Ben, los factores se almacenan internamente como enteros, por lo que cuando haces algo como esto, R no lo maneja de la manera esperada.

Eche un vistazo a str(blarg) siguiendo los pasos del código anterior.

Puede utilizar stringsAsFactors=FALSE como Ben sugirió, o hacer uso del factor:

ifelse(blarg$a!='bb', levels(blarg$a), 'ZZZ') 

O mejor aún, si desea reemplazar los niveles de blarg$a que son 'bb', puede eliminar la declaración ifelse en total:

levels(blarg$a)[levels(blarg$a)=='bb'] <- 'ZZZ' 
Cuestiones relacionadas