3
votes

Comment transformer des noms longs en noms plus courts (en deux parties)

J'ai un vecteur de caractères dans lequel sont utilisés des noms longs, qui se composera de plusieurs mots reliés par des délimiteurs sous la forme d'un point.

x <- c("Dus.fru",
       "Bet.nan",
       "Sal.gla",
       "Sal.jen",
       "Vac.min")

La longueur des noms est différente. Mais seuls les deux premiers mots du nom entier sont importants.

Mon objectif est d'obtenir des noms jusqu'à 7 symboles: 3 symboles initiaux à partir des deux premiers mots et un séparateur en forme de "point" entre eux.

Très proches de ma demande sont ces exemples, mais je ne sais pas comment appliquer ces variations de code à mon cas. R Comment supprimer des caractères de noms de colonnes longs dans un bloc de données et comment ajouter des noms aux "noms de colonne" du bloc de données de sortie dans R?

Que dois-je faire pour que les noms de sortie ressemblent à ceci?

x <- c("Duschekia.fruticosa..Rupr...Pouzar",
       "Betula.nana.L.",
       "Salix.glauca.L.",
       "Salix.jenisseensis..F..Schmidt..Flod.",
       "Vaccinium.minus..Lodd...Worosch")

Toute aide serait appréciée.

r

0 commentaires

3 Réponses :


8
votes

Vous pouvez faire ce qui suit:

gsub("(\\w{1,3})[^\\.]*\\.(\\w{1,3}).*", "\\1.\\2", x)
# [1] "Dus.fru" "Bet.nan" "Sal.gla" "Sal.jen" "Vac.min"

Premièrement, nous faisons correspondre jusqu'à 3 caractères (\\ w {1,3}) , puis ignorons tout ce qui est pas un point [^ \\.] * , correspond à un point \\. puis à nouveau jusqu'à 3 caractères (\\ w {1,3} ) . Enfin tout ce qui vient après . * . Nous n'utilisons alors que les éléments entre parenthèses et les séparons par un point \\1.\\2.


0 commentaires

3
votes

Fractionner sur un point, sous-chaîne de 3 caractères, puis recoller ensemble:

sapply(strsplit(x, ".", fixed = TRUE), function(i){
  paste(substr(i[ 1 ], 1, 3), substr(i[ 2], 1, 3), sep = ".")
})
# [1] "Dus.fru" "Bet.nan" "Sal.gla" "Sal.jen" "Vac.min"


0 commentaires

1
votes

Voici une solution moins élégante que celle de kath, mais un peu plus facile à lire, si vous n'êtes pas un expert en regex.

# Your data
x <- c("Duschekia.fruticosa..Rupr...Pouzar",
       "Betula.nana.L.",
       "Salix.glauca.L.",
       "Salix.jenisseensis..F..Schmidt..Flod.",
       "Vaccinium.minus..Lodd...Worosch")

# A function that takes three characters from first two words and merges them    
cleaner_fun <- function(ugly_string) {
  words <- strsplit(ugly_string, "\\.")[[1]]
  short_words <- substr(words, 1, 3)
  new_name <- paste(short_words[1:2], collapse = ".")
  return(new_name)
}

# Testing function
sapply(x, cleaner_fun)
[1]"Dus.fru" "Bet.nan" "Sal.gla" "Sal.jen" "Vac.min"


0 commentaires