es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Generar una cadena alfanumérica única basada en un valor previo utilizando R.

Tengo una columna parcialmente poblada con IDs alfanuméricos únicos que todas empiezan con ‘a’ y terminan con ‘b’, pero los números en el medio son únicos y la longitud total de la cadena debe ser 6, por ejemplo a4338b, a4339b (…)

Estoy buscando una función en R que me permita llenar los valores en blanco en orden ascendente basándome en el último (y mayor) identificador.

¿Alguien podría proporcionar algún consejo sobre cómo hacerlo?

Muchas gracias.

Dataframe de muestra:

df <- data.frame(
id = c(“a4338b”, “a4339b”, “a4340b”, NA, NA),
post = c(“teacher”, “postal worker”, “chef”, “waitress”, “presenter”)
)

Dataframe esperado:

df <- data.frame(
id = c(“a4338b”, “a4339b”, “a4340b”, “a4341b”, “a4342b”),
post = c(“teacher”, “postal worker”, “chef”, “waitress”, “presenter”)
)

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Una opción en R para completar los valores faltantes en orden ascendente es extraer primero la parte numérica del ID más alto existente, incrementarlo en 1 y luego usar sprintf() para formatear los nuevos identificadores con el prefijo y sufijo correctos. Aquí hay un ejemplo:

    “`{r}

    Datos de ejemplo

    df <- data.frame(
    id = c(“a4338b”, “a4339b”, “a4340b”, NA, NA),
    post = c(“profesor”, “trabajador postal”, “chef”, “camarera”, “presentador”))

    Extraer la parte numérica del ID más alto existente

    last_id <- max(as.numeric(gsub(“[^0-9]”, “”, df$id), na.rm = TRUE))

    Completar los IDs faltantes

    df$id[is.na(df$id)] <- sprintf(“a%04db”, last_id + 1:length(which(is.na(df$id))))

    Resultado

    df


      id                post
    

    1 a4338b profesor
    2 a4339b trabajador postal
    3 a4340b chef
    4 a4341b camarera
    5 a4342b presentador
    “`

    Aquí, gsub("[^0-9]", "", df$id) elimina todos los caracteres no numéricos de la columna id (es decir, el prefijo y el sufijo), as.numeric() convierte el vector resultante en numérico y max() encuentra el número más alto. Luego, last_id + 1:length(which(is.na(df$id))) genera una secuencia de números del 1 al número de IDs faltantes, que se agregan a last_id para obtener las partes numéricas deseadas. Finalmente, sprintf("a%04db", ...) formatea las partes numéricas como cadenas de texto con el prefijo y sufijo correctos y cero de relleno. El vector resultante se asigna a los IDs faltantes en df$id usando df$id[is.na(df$id)] <- ....

Comments are closed.