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?

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

É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"

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.


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" 

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


Vous pouvez utiliser à la sub()place de gsub().
sindri_baldur
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.