studio mtext change r string dataframe matching

mtext - plot title r



Cuerda parcial de animales en R (2)

Puede haber una solución más elegante que esta, pero podría usar grep con | para especificar coincidencias alternativas.

d[grep("cat|lion|tiger|panther", d$name), "species"] <- "feline" d[grep("bird|eagle|sparrow", d$name), "species"] <- "avian" d[grep("dog|yorkie", d$name), "species"] <- "canine"

He asumido que te referías a "aviar", y omití "bulldog" ya que contiene "perro".

Es posible que desee agregar ignore.case = TRUE al grep.

salida:

# name label species #1 brown cat 1 feline #2 blue cat 2 feline #3 big lion 3 feline #4 tall tiger 4 feline #5 black panther 5 feline #6 short cat 6 feline #7 red bird 7 avian #8 short bird stuffed 8 avian #9 big eagle 9 avian #10 bad sparrow 10 avian #11 dog fish 11 canine #12 head dog 12 canine #13 brown yorkie 13 canine #14 lab short bulldog 14 canine

Tengo un marco de datos,

d<-data.frame(name=c("brown cat", "blue cat", "big lion", "tall tiger", "black panther", "short cat", "red bird", "short bird stuffed", "big eagle", "bad sparrow", "dog fish", "head dog", "brown yorkie", "lab short bulldog"), label=1:14)

Me gustaría buscar en la columna de name y si aparecen las palabras "gato", "león", "tigre" y "pantera", quiero asignar la cadena de caracteres feline a una nueva columna y la correspondiente species fila.

Si aparecen las palabras "bird", "eagle", and "sparrow" , quiero asignar la cadena de caracteres avian a una nueva columna y las species fila correspondientes.

Si aparecen las palabras "perro", "yorkie" y "bulldog", deseo asignar el canine cadena de caracteres a una nueva columna y a las species fila correspondientes.

Lo ideal sería que guardara esto en una lista o algo similar que pueda mantener al comienzo del guión, porque a medida que aparecen nuevas variantes de la especie en la categoría de nombre, sería bueno tener acceso fácil para actualizar lo que califica Como feline , avian y canine .

Esta pregunta casi se responde aquí ( cómo crear una nueva columna en el marco de datos basado en una cadena parcial que coincida con otra columna en R ), pero no aborda el giro de múltiples nombres que está presente en este problema.


Una forma elegante de hacer esto (digo elegante-ish porque, aunque es la forma más elegante que conozco, no es genial) es algo así como:

#Define the regexes at the beginning of the code regexes <- list(c("(cat|lion|tiger|panther)","feline"), c("(bird|eagle|sparrow)","avian"), c("(dog|yorkie|bulldog)","canine")) .... #Create a vector, the same length as the df output_vector <- character(nrow(d)) #For each regex.. for(i in seq_along(regexes)){ #Grep through d$name, and when you find matches, insert the relevant ''tag'' into #The output vector output_vector[grepl(x = d$name, pattern = regexes[[i]][1])] <- regexes[[i]][2] } #Insert that now-filled output vector into the dataframe d$species <- output_vector

La ventaja de este método son varias veces

  1. Solo tiene que modificar el marco de datos una vez en todo el proceso, lo que aumenta la velocidad del bucle (los marcos de datos no tienen modificación in situ; para modificar un marco de datos 3 veces, básicamente lo está reetiquetando y recreando 3). veces).
  2. Al especificar de antemano la longitud del vector, ya que sabemos lo que será, aumentará la velocidad aún más al garantizar que el vector de salida nunca necesite más memoria asignada después de que se haya creado.
  3. Debido a que es un bucle, en lugar de repetidas, llamadas manuales, la adición de más filas y categorías al objeto ''regexes'' no requerirá una modificación adicional del código. Se ejecutará tal como lo hace ahora.

La única desventaja, y esto se aplica a, creo, la mayoría de las soluciones que probablemente obtendrá, es que si algo coincide con múltiples patrones, el último patrón de la lista con la que coincidirá será su etiqueta de "especie".