1
votes

Besoin d'ajouter 0 à l'emplacement spécifique de tous les éléments qui ont une longueur de caractère spécifique

Beaucoup de réponses pour savoir comment ajouter des 0 non significatifs, mais ma situation est la suivante:

J'ai un dataframe où la première colonne est des patientsID, et pour ceux qui n'ont que 3 caractères, je dois ajouter un 0 au 2ème caractère de l'ID:

library(stringr)
df$patientIDsnew <- ifelse(str_length(df$patientIDs) < 4, 

Je suppose que je dois configurer un ifelse où il compte la str_length, et si

patientIDs <- c("E015", "E04", "E212") #what I have
patientIDsnew <- c("E015", "E004", "E212") #what I need
hr <- c(110, 105, 135)
df <- data.frame(patientIDs,patientIDsnew, hr)


0 commentaires

3 Réponses :


2
votes

Nous pouvons essayer d'utiliser sub pour une option de base R:

patientIDs <- c("E015", "E04", "E212")
patientIDsnew <- sub("^([A-Z])(\\d{2})$", "\\10\\2", patientIDs, perl=TRUE)
patientIDsnew

[1] "E015" "E004" "E212"

L'idée ici est de faire correspondre et de capturer la première lettre ainsi que les deux chiffres de fin uniquement , dans un groupe de capture séparé (les ID à 3 chiffres ne correspondent pas). Ensuite, nous pouvons remplacer en ajoutant un zéro de remplissage.


2 commentaires

Comment obtenez-vous si bon en regex ou autre? Les ressources que je trouve sont très minimalistes


@Ciney Oui, la plupart de la documentation regex est très basique. Je suppose que vous devez le pratiquer pour devenir compétent.



2
votes

Voici une version moins efficace car je suis nul avec les regex. Divisez les identifiants en «E». Ensuite, si l'un des ID numériques a une longueur inférieure à 3, ajoutez un zéro. Puis rassemblez-les.

patientIDs %>%
  str_split_fixed("", n = 2) %>%
  as_tibble() %>%
  mutate(V2 = if_else(str_length(V2) < 3, str_pad(V2, side = "left", width = 3, pad = "0"), V2)) %>%
  mutate(new = str_c(V1, V2))


0 commentaires

2
votes

Nous pouvons obtenir les patientsIDs qui ont moins de 4 caractères, casser la chaîne en fonction de leur position et les coller ensemble.

patientIDsnew <- patientIDs
inds <- nchar(patientIDsnew) < 4
patientIDsnew[inds] <- paste0(substr(patientIDsnew[inds], 1, 1), 0, 
                              substr(patientIDsnew[inds], 2,4))
patientIDsnew
#[1] "E015" "E004" "E212"


0 commentaires