Rimuovi parte di una stringa


90

Come si rimuove una parte di una stringa? Ad esempio in ATGAS_1121Voglio rimuovere tutto prima _.

Risposte:


131

Usa espressioni regolari. In questo caso puoi usare gsub:

gsub("^.*?_","_","ATGAS_1121")
[1] "_1121"

Questa espressione regolare corrisponde all'inizio della stringa (^), a qualsiasi carattere (.) Ripetuto zero o più volte (*) e al trattino basso (_). Il ? rende la corrispondenza "pigra" in modo che solo le corrispondenze siano fino al primo trattino basso. Quella corrispondenza viene sostituita con solo un trattino basso. Vedi ?regexper maggiori dettagli e riferimenti


6
Regex precedente sarebbe partita per l'ultima sottolineatura nel caso di, ad esempio, gsub("^.*_","_","ATGAS_1121_xxx"). Ora risolto.
Richie Cotton

7
@ Joshua, trovo davvero utile che tu abbia spiegato il ruolo delle espressioni regolari.
Vasile

Funziona anche con un vettore di stringhe come ultimo argomento. R è fantastico così.
nought101

37

Puoi usare un built-in per questo, strsplit :

> s = "TGAS_1121"
> s1 = unlist(strsplit(s, split='_', fixed=TRUE))[2]
> s1    
 [1] "1121"

strsplit restituisce entrambi i pezzi della stringa analizzati sul parametro split come un elenco . Probabilmente non è quello che vuoi, quindi racchiudi la chiamata in unlist , quindi indicizza quell'array in modo che venga restituito solo il secondo dei due elementi nel vettore.

Infine, il parametro fixed dovrebbe essere impostato su TRUE per indicare che il parametro split non è un'espressione regolare, ma un carattere di corrispondenza letterale.


23

Se sei un tipo di persona Tidyverse, ecco la soluzione stringr :

R> library(stringr)
R> strings = c("TGAS_1121", "MGAS_1432", "ATGAS_1121") 
R> strings %>% str_replace(".*_", "_")
[1] "_1121" "_1432" "_1121"
# Or:
R> strings %>% str_replace("^[A-Z]*", "")
[1] "_1121" "_1432" "_1121"

21

Ecco la strsplitsoluzione se sè un vettore:

> s <- c("TGAS_1121", "MGAS_1432")
> s1 <- sapply(strsplit(s, split='_', fixed=TRUE), function(x) (x[2]))
> s1
[1] "1121" "1432"

2
Molto utile, grazie! Cordiali saluti per ottenere la prima parte della stringa (cioè prima di '_'), sostituire [2] alla fine con un [1].
stevenjoe

4

Forse la soluzione più intuitiva è probabilmente quella di utilizzare la stringrfunzione str_removeche è ancora più semplice di str_replacequanto ha solo 1 argomento invece di 2.

L'unica parte delicata del tuo esempio è che vuoi mantenere il carattere di sottolineatura ma è possibile: devi trovare la corrispondenza con l'espressione regolare finché non trova lo schema di stringa specificato (?=pattern).

Vedi esempio:

strings = c("TGAS_1121", "MGAS_1432", "ATGAS_1121")
strings %>% stringr::str_remove(".+?(?=_)")

[1] "_1121" "_1432" "_1121"

3

Ecco la strsplitsoluzione per un dataframe che utilizza dplyrpackage

col1 = c("TGAS_1121", "MGAS_1432", "ATGAS_1121") 
col2 = c("T", "M", "A") 
df = data.frame(col1, col2)
df
        col1 col2
1  TGAS_1121    T
2  MGAS_1432    M
3 ATGAS_1121    A

df<-mutate(df,col1=as.character(col1))
df2<-mutate(df,col1=sapply(strsplit(df$col1, split='_', fixed=TRUE),function(x) (x[2])))
df2

  col1 col2
1 1121    T
2 1432    M
3 1121    A
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.