web-dev-qa-db-fra.com

Comment supprimer les n derniers caractères de chaque élément du vecteur R

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?

81
LucasSeveryn

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
90
nfmcclure

Voici un moyen avec gsub:

cs <- c("foo_bar","bar_foo","Apple","beer")
gsub('.{3}$', '', cs)
# [1] "foo_" "bar_" "ap"   "b"
72
Matthew Plourde

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.

21
Blaszard

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" 
13
gagolews

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

2
krads