En el marco de datos R codificado a continuación, me gustaría reemplazar todas las veces que B
aparecen 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 intento inicial fue usar declaraciones for
y if
como esta:
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
with b
. Puedo ver por qué esto está haciendo esto, pero parece que no puedo lograr que reemplace solo aquellos casos de $ nm basura donde estaba el valor original B
.
NOTA: Me las arreglé para 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)
Respuestas:
Más fácil convertir nm a caracteres y luego realizar el cambio:
EDITAR: Y si de hecho necesita mantener nm como factores, agregue esto al final:
fuente
otra forma útil de reemplazar valores
fuente
La respuesta corta es:
Eche un vistazo a los vectores de índice en la Introducción de R (si aún no lo ha leído).
EDITAR. Como se notó en los comentarios, esta solución funciona para vectores de caracteres, por lo que falla en sus datos.
Para el factor, la mejor manera es cambiar de nivel:
fuente
c("B","C")
. Hacerlojunk$nm[junk$nm == "B"]
es la mejor manera.b
del factor al factor nm. La versión de diliop es de hecho la mejor si quieres trabajar con personajes, no con factores. (¡Piense siempre en el tipo que tienen sus variables primero!)%in%
y==
es elNA
manejo:c(1,2,NA)==1
daTRUE, FALSE, NA
peroc(1,2,NA) %in% 1
daTRUE, FALSE, FALSE
. Y sí, me olvidé de comprobar si esto funciona: /Como los datos que muestra son factores, complica un poco las cosas. La respuesta de @ diliop aborda el problema convirtiendo
nm
a 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.
Eso es bastante simple y a menudo olvido que hay una función de reemplazo para
levels()
.Editar: como señaló @Seth en los comentarios, esto se puede hacer en una sola línea, sin pérdida de claridad:
fuente
levels()
. ¿Qué tal el delineadorjunk <- within(junk, levels(nm)[levels(nm)=="B"] <- "b")
?La forma más fácil de hacer esto en un comando es usar el
which
comando y tampoco es necesario cambiar los factores en caracteres haciendo esto:fuente
Ha creado una variable de factor en,
nm
por lo que debe evitar hacerlo o agregar un nivel adicional a los atributos de factor. También debe evitar el uso<-
en los argumentos de data.frame ()Opción 1:
Opcion 2:
fuente
data.frame
?b
como un nivel, sólo cambia el nivel que estáB
ab
.a <- data.frame(x<-1:10)
. Su nombre de columna no esx
sino más bien desordenadox....1.10
. Es mejor usar data.frame (x = 1: 10). Entonces sabes cuál es el nombre de tu columna.predict()
que se quejará si los niveles de los factores en los nuevos datos no coinciden con los utilizados para ajustar el modelo. Más limpio a largo plazo para obtener los datos formateados como desee, correctamente, que depender de atajos. Estoy de acuerdo en que podría ser más fácil no convertirlo en un factor, pero si ya lo es, o necesita serlo para algún ejercicio de modelado ...Si está trabajando con variables de carácter (tenga en cuenta que
stringsAsFactors
aquí es falso) puede usar reemplazar:fuente
Llame a esta función usando la línea de abajo.
fuente