gsub paralelo: ¿cómo se puede eliminar una cadena diferente en cada elemento de un vector

StackOverflow https://stackoverflow.com/questions/2078946

  •  21-09-2019
  •  | 
  •  

Pregunta

Tengo una lista de invitados que tiene un apellido en una columna y luego en otra columna que tiene los nombres o los nombres completos (primer espacio última) de cada persona en la familia. Estoy deseando conseguir la otra columna de tener sólo los primeros nombres.

gsub(guest.w$Last.Name,"",guest.w$Party.Name.s.)

Eso funcionaría perfectamente si acabo de tener una fila pero ¿cómo se hará por cada fila de la trama de datos. ¿Tengo que escribir un bucle? ¿Hay una manera de hacerlo en paralelo de manera similar a la forma en Pmax () se refiere a max ().

Mi problema es similar en la forma de un previamente hizo la pregunta por JD largo pero esa pregunta era un juego de niños en comparación con la mía.

Ejemplo

:

Smith; Joe Smith, Kevin Smith, Jane Smith
Alterar; Robert Alter, María Alter, Ronald Alter

Se convierte

Smith; Joe, Kevin, Jane
Alterar; Robert, María, Ronald

¿Fue útil?

Solución

El uso de Hadley adply:

library(plyr)
df <- data.frame(rbind(c('Smith', 'Joe Smith, Kevin Smith, Jane Smith'), c('Alter', 'Robert Alter, Mary Alter, Ronald Alter')))
names(df) <- c("last", "name")
adply(df,1,transform, name=gsub(last, '', name))

Es probable que tenga que limpiar los espacios en su nuevo vector.

Otros consejos

es probable que tenga que hacer un poco de "envoltorio" alrededor de su expresión con el fin de obtener la función de trabajo de aplicación ():

  • Si su trabajo en un hoja.de.datos se debe utilizar apply () (y no sapply ())
  • debe crear una función para aplicar (con una cláusula de retorno)
  • trabajando en hoja.de.datos línea como entrada de la función es un poco complicado - que se convierten en vectores y pierden algunas propiedades (no se puede usar el signo $ para llamar campos con nombre) por lo que es mejor para convertirlo en primer lugar en una lista

El resultado final es como la siguiente:

df <- rbind(c('Smith', 'Joe Smith, Kevin Smith, Jane Smith'), c('Alter', 'Robert Alter, Mary Alter, Ronald Alter'))
colnames(df) = c('Last.Name', 'Party.Name.s.')
apply(df,1,function(y) {y = as.list(y);return(gsub(y$Last.Name, "", y$Party.Name.s.))}) 

No estoy seguro de que funcionará en una trama de datos, pero se puede probar una de las funciones de aplicación:

`y1 <- sapply(dataframe, gsub(guest.w$Last.Name,"",guest.w$Party.Name.s.))`
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top