Je suis très nouveau sur R et je ne trouvais pas un exemple simple en ligne sur la façon de supprimer les n derniers caractères de chaque élément d’un vecteur (tableau?)
Je viens d'un contexte Java, donc ce que je voudrais faire est de parcourir chaque élément de a$data
et de supprimer les 3 derniers caractères de chaque élément.
Comment vous y prendriez-vous?
Voici un exemple de ce que je ferais. J'espère que c'est ce que vous cherchez.
char_array = c("foo_bar","bar_foo","Apple","beer")
a = data.frame("data"=char_array,"data2"=1:4)
a$data = substr(a$data,1,nchar(a$data)-3)
a devrait maintenant contenir:
data data2
1 foo_ 1
2 bar_ 2
3 ap 3
4 b 4
Voici un moyen avec gsub
:
cs <- c("foo_bar","bar_foo","Apple","beer")
gsub('.{3}$', '', cs)
# [1] "foo_" "bar_" "ap" "b"
Bien que ce soit essentiellement le même avec la réponse de @nfmcclure, je préfère utiliser le paquet stringr
car il fournit un ensemble de fonctions dont les noms sont les plus cohérents et descriptifs que ceux de la base R (en fait, je recherche toujours - "comment obtenir le nombre de caractères dans R" car je ne me souviens plus du nom nchar()
).
library(stringr)
str_sub(iris$Species, 1, str_length(iris$Species)-3)
Cela supprime les 3 derniers caractères de chaque valeur de la colonne Species
.
La même chose peut être obtenue avec le paquet stringi :
library('stringi')
char_array <- c("foo_bar","bar_foo","Apple","beer")
a <- data.frame("data"=char_array, "data2"=1:4)
(a$data <- stri_sub(a$data, 1, -4)) # from the first to the last but 4th char
## [1] "foo_" "bar_" "ap" "b"
Similaire à @Matthew_Plourde avec gsub
Toutefois, si vous utilisez un modèle qui réduira à zéro le nombre de caractères, c’est-à-dire que vous recevrez "" si la chaîne originale est plus courte que le nombre de caractères à couper:
cs <- c("foo_bar","bar_foo","Apple","beer","so","a")
gsub('.{0,3}$', '', cs)
# [1] "foo_" "bar_" "ap" "b" "" ""
La différence est, {0,3}
le quantificateur indique 0 à 3 correspondances, alors que {3}
nécessite exactement 3 correspondances, sinon aucune correspondance n'est trouvée, auquel cas gsub
renvoie la chaîne d'origine non modifiée.
N.B. utiliser {,3}
serait équivalent à {0,3}
, je préfère simplement la dernière notation.
Voir ici pour plus d'informations sur les quantificateurs de regex: https://www.regular-expressions.info/refrepeat.html