Come si rimuove una parte di una stringa? Ad esempio in ATGAS_1121
Voglio rimuovere tutto prima _
.
Risposte:
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 ?regex
per maggiori dettagli e riferimenti
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.
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"
Ecco la strsplit
soluzione 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"
Forse la soluzione più intuitiva è probabilmente quella di utilizzare la stringr
funzione str_remove
che è ancora più semplice di str_replace
quanto 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"
Ecco la strsplit
soluzione per un dataframe che utilizza dplyr
package
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
gsub("^.*_","_","ATGAS_1121_xxx")
. Ora risolto.