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”)
)
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
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 columnaid
(es decir, el prefijo y el sufijo),as.numeric()
convierte el vector resultante en numérico ymax()
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 alast_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 endf$id
usandodf$id[is.na(df$id)] <- ...
.