2011-08-29 12 views

Respuesta

0

Otro método puede ser algo como esto (de manera similar a la pregunta Recoding Numeric Vector):

type <- rep("Finite", length(a)) 
type[is.nan(a)] <- "NaN" 
type[is.infinite(a)] <- "Infinite" 
+4

Es una buena práctica responder a sus propias preguntas sobre SO, pero este es un ejemplo particularmente pobre de una respuesta, ya que su solución presenta una serie de nuevas variables que no aparecen en la pregunta. – Andrie

+0

@UriLaserson Limpio un poco su respuesta (que cubre los consejos de Andrie), puede retroceder si no le gusta. – Marek

6

ifelse() parece funcionar razonablemente bien:

b <- ifelse(is.finite(a), "Finite", ifelse(is.infinite(a), "Infinite", "NaN")) 
> b 
[1] "Finite" "Finite" "Finite" "Infinite" "NaN" 

Técnicamente, que devuelve un vector de caracteres, que se puede convertir con as.factor() o simplemente envolver factor() alrededor de la llamada inicial para volver un factor para empezar. ... aunque el personaje puede adaptarse a tus necesidades dependiendo de lo que necesites hacer.

+0

Una cosa: 'NA' están codificados como' "NaN" 'en su solución. – Marek

2

También es posible usar match (y no se olvide de NA 's):

f <- function(x) { 
    codes <- c("NaN", "Inf", "Inf", "NA", "Finite") 
    codes[match(x, c(NaN, Inf, -Inf, NA), nomatch=5L)] 
} 

f(a) 
# [1] "Finite" "Finite" "Finite" "Inf" "NaN" 

f(c(7.777, -Inf, NA, Inf, NaN, 0/0)) 
# [1] "Finite" "Inf" "NA"  "Inf" "NaN" "NaN" 
2

Aquí es una variante que usa los propios nombres de R, excepto para "Finito" - por lo que es un poco más corto para escribir y como un bono también maneja el infinito negativo y NA:

# Include -Inf and NA... 
a <- c(0.1,0.6,23,Inf,-Inf,NaN,NA) 

format(ifelse(is.finite(a), "Finite", a), justify="none") 
#[1] "Finite" "Finite" "Finite" "Inf" "-Inf" "NaN" "NA" 

... Pero si realmente desea que las cadenas "infinito" y "-INFINITY", entonces esto haría que:

sub("Inf", "Infinity", format(ifelse(is.finite(a), "Finite", a), justify="none")) 

Por último, si desea mantener los NA s, a continuación, sólo no llame al format:

sub("Inf", "Infinity", ifelse(is.finite(a), "Finite", a)) 
#[1] "Finite" "Finite" "Finite" "Infinity" "-Infinity" "NaN"  NA 
+0

Alguna variante podría ser 'ifelse (is.finite (a)," Finite ", as.character (a))' que transforman 'NA' en' NA' (no en '' NA "' cadena). – Marek

+0

@Marek - sí, lo sé, pero pensé que ya tenía demasiadas variantes :) ... Y el último mapea Inf a Infinity como solicitó el OP. – Tommy

Cuestiones relacionadas