numero funciones for estructuras ejemplos control anidados r recode

funciones - Reemplazar un valor en un marco de datos basado en una declaración condicional(`si`)



if anidados en r (7)

Como los datos que muestra son factores, complica las cosas un poco. La respuesta de @ diliop aborda el problema convirtiendo a nm en una variable de carácter. Para volver a los factores originales, se requiere un paso más.

Una alternativa es manipular los niveles del factor en su lugar.

> lev <- with(junk, levels(nm)) > lev[lev == "B"] <- "b" > junk2 <- within(junk, levels(nm) <- lev) > junk2 nm val 1 A a 2 b b 3 C c 4 D d 5 A e 6 b f 7 C g 8 D h 9 A i 10 b j 11 C k 12 D l

Eso es bastante simple y a menudo me olvido de que hay una función de reemplazo para los levels() .

Editar: Como se señala por @Seth en los comentarios, esto se puede hacer de una sola línea, sin pérdida de claridad:

within(junk, levels(nm)[levels(nm) == "B"] <- "b")

En el marco de datos R codificado a continuación, me gustaría reemplazar todas las veces que aparece B con b .

junk <- data.frame(x <- rep(LETTERS[1:4], 3), y <- letters[1:12]) colnames(junk) <- c("nm", "val")

esto proporciona:

nm val 1 A a 2 B b 3 C c 4 D d 5 A e 6 B f 7 C g 8 D h 9 A i 10 B j 11 C k 12 D l

Mi primer intento fue usar un for y if declaraciones como tal:

for(i in junk$nm) if(i %in% "B") junk$nm <- "b"

pero como estoy seguro de que puede ver, esto reemplaza TODOS los valores de junk$nm con b . Puedo ver por qué esto está haciendo esto, pero parece que no puedo reemplazar solo los casos de basura $ nm donde el valor original era B

NOTA: gsub resolver el problema con gsub pero, con el interés de aprender RI, aún me gustaría saber cómo hacer que mi enfoque original funcione (si es posible)


Ha creado una variable de factor en nm por lo que debe evitar hacerlo o añadir un nivel adicional a los atributos de factor. También debe evitar el uso de <- en los argumentos a data.frame ()

Opción 1:

junk <- data.frame(x = rep(LETTERS[1:4], 3), y =letters[1:12], stringsAsFactors=FALSE) junk$nm[junk$nm == "B"] <- "b"

Opcion 2:

levels(junk$nm) <- c(levels(junk$nm), "b") junk$nm[junk$nm == "B"] <- "b" junk


La forma más fácil de hacer esto en un comando es usar which comando y también no es necesario cambiar los factores en carácter al hacer esto:

junk$nm[which(junk$nm=="B")]<-"b"


La respuesta corta es:

junk$nm[junk$nm %in% "B"] <- "b"

Eche un vistazo a los vectores de índice en la Introducción R (si aún no lo lee).

EDITAR. Como se notó en los comentarios, esta solución funciona para los vectores de caracteres, por lo que falla en sus datos.

Para factor mejor forma es cambiar nivel:

levels(junk$nm)[levels(junk$nm)=="B"] <- "b"


Más fácil para convertir nm a caracteres y luego hacer el cambio:

junk$nm <- as.character(junk$nm) junk$nm[junk$nm == "B"] <- "b"

EDITAR: Y si de verdad necesitas mantener nm como factores, agrega esto al final:

junk$nm <- as.factor(junk$nm)


Si está trabajando con variables de caracteres (tenga en cuenta que stringsAsFactors es falso aquí) puede usar replace:

junk <- data.frame(x <- rep(LETTERS[1:4], 3), y <- letters[1:12], stringsAsFactors = FALSE) colnames(junk) <- c("nm", "val") junk$nm <- replace(junk$nm, junk$nm == "B", "b") junk # nm val # 1 A a # 2 b b # 3 C c # 4 D d # ...


otra forma útil de reemplazar valores

library(plyr) revalue(junk$nm, c("B"="b"))