Come rimuovere gli ultimi n caratteri da ogni elemento nel vettore R.


106

Sono molto nuovo su R e non sono riuscito a trovare un semplice esempio online di come rimuovere gli ultimi n caratteri da ogni elemento di un vettore (array?)

Vengo da uno sfondo Java, quindi quello che vorrei fare è iterare su ogni elemento a$datae rimuovere gli ultimi 3 caratteri da ogni elemento.

Come lo faresti?

Risposte:


115

Ecco un esempio di cosa farei. Spero sia quello che stai cercando.

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 dovrebbe ora contenere:

  data data2
1 foo_ 1
2 bar_ 2
3   ap 3
4    b 4

Stranamente, ho dovuto cambiare -3in -0per ottenere l'effetto desiderato! Ho molti dati con date, come: "2014-03-27 23:00:00 GMT" "2014-03-31 00:00:00 BST"- sì, due fusi orari insieme e la funzione as.Date restituisce risultati imprevisti (giorno prima per le date BST) - quindi volevo rimuovere il timbro del fuso orario, risulta che devo fare -0e scompare, insieme alle ore
LucasSeveryn

Considera anche la funzione strptime, ma non ho usato i fusi orari prima. Penso che potrebbe riconoscerlo. Presumibilmente "% Z" riconosce i fusi orari. Ho anche rimosso la funzione sapply. Ho dimenticato quanto R ama vettorializzare le sue funzioni.
nfmcclure

@LucasSeveryn Se desideri convertire le rappresentazioni dell'ora dei caratteri in date che tengano conto dei fusi orari, modificale nella tua domanda. Probabilmente ci sono risposte migliori che ti porteranno direttamente ai risultati desiderati (come strptime).
Blue Magister

84

Ecco un modo con gsub:

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

4
(+1) Grande fan di regex. Può essere utilizzato su quasi tutto.
Rich Scriven

8
Nota: restituisce la stringa originale se è più lunga del numero di caratteri da tagliare. Considera gsub('.{5}$', '', 'abcd').
Tomas Greif

32

Sebbene questo sia per lo più lo stesso con la risposta di @nfmcclure, preferisco usare il stringrpacchetto in quanto fornisce un insieme di funzioni i cui nomi sono più coerenti e descrittivi di quelli in base R (infatti cerco sempre su Google "come ottenere il numero di caratteri in R " poiché non ricordo il nome nchar()).

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

Ciò rimuove gli ultimi 3 caratteri da ogni valore nella Speciescolonna.


22
con il stringrpacchetto c'è una soluzione ancora più semplice: str_sub(iris$Species, end=-4)
jan-glx

14

Lo stesso si può ottenere con il pacchetto 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

Simile a @Matthew_Plourde usando gsub

Tuttavia, utilizzando un modello che taglierà a zero caratteri, ovvero restituirà "" se la stringa originale è più corta del numero di caratteri da tagliare:

cs <- c("foo_bar","bar_foo","apple","beer","so","a")
gsub('.{0,3}$', '', cs)
# [1] "foo_" "bar_" "ap"   "b"    ""    ""

La differenza è che il {0,3}quantificatore indica da 0 a 3 corrispondenze, mentre {3}richiede esattamente 3 corrispondenze, altrimenti non viene trovata alcuna corrispondenza, nel qual caso gsubrestituisce la stringa originale non modificata.

NB usare {,3}sarebbe equivalente a {0,3}, preferisco semplicemente quest'ultima notazione.

Vedere qui per ulteriori informazioni sui quantificatori di espressioni regolari: https://www.regular-expressions.info/refrepeat.html


Puoi usare sub()invece di gsub().
sindri_baldur
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.