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

106

Je suis très nouveau dans R et je n'ai pas trouvé d'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 arrière-plan Java, donc ce que je voudrais faire est d'itérer sur chaque élément a$dataet de supprimer les 3 derniers caractères de chaque élément.

Comment procéderiez-vous?

LucasSeveryn
la source

Réponses:

115

Voici un exemple de ce que je ferais. J'espère que c'est ce que vous recherchez.

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
nfmcclure
la source
Étrangement, je devais changer -3pour -0obtenir l'effet désiré! J'ai beaucoup de données avec des dates, comme: "2014-03-27 23:00:00 GMT" "2014-03-31 00:00:00 BST"- oui, deux fuseaux horaires ensemble, et la fonction as.Date renvoie des résultats inattendus (jour plus tôt pour les dates BST) - donc je voulais supprimer le timbre de fuseau horaire, il s'avère que je dois faire -0et il disparaît, avec les heures
LucasSeveryn
Considérez également la fonction strptime, je n'ai cependant jamais utilisé de fuseaux horaires. Je pense qu'il pourrait le reconnaître. On suppose que «% Z» reconnaît les fuseaux horaires. J'ai également supprimé la fonction sapply. J'ai oublié à quel point R aime vectoriser ses fonctions.
nfmcclure
@LucasSeveryn Si vous souhaitez convertir les représentations temporelles des caractères en dates en tenant compte des fuseaux horaires, veuillez le modifier dans votre question. Il existe probablement de meilleures réponses qui vous mèneront directement aux résultats souhaités (tels que strptime).
Blue Magister
84

Voici un moyen avec gsub:

cs <- c("foo_bar","bar_foo","apple","beer")
gsub('.{3}$', '', cs)
# [1] "foo_" "bar_" "ap"   "b"
Matthieu Plourde
la source
4
(+1) Grand fan de regex. Il peut être utilisé sur presque tout.
Rich Scriven
8
Remarque: Cela renvoie la chaîne d'origine si elle est plus longue que le nombre de caractères à couper. Considérez gsub('.{5}$', '', 'abcd').
Tomas Greif
32

Bien que ce soit essentiellement la même chose avec la réponse de @nfmcclure, je préfère utiliser stringrpackage car il fournit un ensemble de fonctions dont les noms sont plus cohérents et descriptifs que ceux de la base R (en fait, je cherche toujours sur Google "comment obtenir le nombre de caractères en R " car je ne me souviens plus du nom nchar()).

library(stringr)
str_sub(iris$Species, end=-4)
#or 
str_sub(iris$Species, 1, str_length(iris$Species)-3)

Cela supprime les 3 derniers caractères de chaque valeur dans la Speciescolonne.

Blaszard
la source
22
avec le stringrpackage, il existe une solution encore plus simple: str_sub(iris$Species, end=-4)
jan-glx
14

La même chose peut être obtenue avec le package 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" 
gagolews
la source
3

Similaire à @Matthew_Plourde utilisant gsub

Cependant, en utilisant un modèle qui réduira à zéro caractère, c'est-à-dire retourner "" si la chaîne d'origine 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 que le {0,3}quantificateur indique 0 à 3 correspondances, alors que {3}nécessite exactement 3 correspondances, sinon aucune correspondance n'est trouvée, auquel cas gsubrenvoie la chaîne d'origine non modifiée.

NB utiliser {,3}équivaudrait à {0,3}, je préfère simplement la dernière notation.

Voir ici pour plus d'informations sur les quantificateurs regex: https://www.regular-expressions.info/refrepeat.html

krads
la source
Vous pouvez utiliser à la sub()place de gsub().
sindri_baldur