Hapus bagian dari string

90

Bagaimana cara menghapus bagian dari string? Misalnya di ATGAS_1121Saya ingin menghapus semuanya sebelumnya _.

Lisann
sumber

Jawaban:

131

Gunakan ekspresi reguler. Dalam hal ini, Anda dapat menggunakan gsub:

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

Ekspresi reguler ini cocok dengan awal string (^), karakter apa pun (.) Yang berulang kali nol atau lebih (*), dan garis bawah (_). Itu? membuat kecocokan menjadi "malas" sehingga hanya kecocokan yang terletak di garis bawah pertama. Pertandingan itu diganti hanya dengan garis bawah. Lihat ?regexuntuk lebih jelasnya dan referensi

Joshua Ulrich
sumber
6
Regex sebelumnya akan cocok dengan garis bawah terakhir dalam kasus, misalnya gsub("^.*_","_","ATGAS_1121_xxx"),. Sekarang sudah diperbaiki.
Richie Cotton
7
@Joshua Saya merasa sangat berguna bahwa Anda menjelaskan peran ekspresi reguler.
Vasile
Ini juga berfungsi dengan vektor string sebagai argumen terakhir. R mengagumkan seperti itu.
n nothing101
37

Anda dapat menggunakan built-in untuk ini, strsplit :

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

strsplit mengembalikan kedua bagian string yang diurai pada parameter split sebagai daftar . Mungkin itu bukan yang Anda inginkan, jadi bungkus panggilan dalam unlist , lalu indeks larik tersebut sehingga hanya elemen kedua dari dua elemen dalam vektor yang dikembalikan.

Terakhir, parameter tetap harus disetel ke TRUE untuk menunjukkan bahwa parameter pemisahan bukanlah ekspresi reguler, tetapi karakter pencocokan literal.

doug
sumber
23

Jika Anda tipe orang yang rapi , inilah solusi 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"
n nothing101
sumber
21

Berikut strsplitsolusinya jika sadalah vektor:

> s <- c("TGAS_1121", "MGAS_1432")
> s1 <- sapply(strsplit(s, split='_', fixed=TRUE), function(x) (x[2]))
> s1
[1] "1121" "1432"
verbamour.dll
sumber
2
Sangat membantu, terima kasih! FYI untuk mendapatkan bagian pertama dari string (yaitu sebelum '_'), ganti [2] di akhir dengan [1].
stevenjoe
4

Mungkin solusi paling intuitif mungkin menggunakan stringrfungsi str_removeyang bahkan lebih mudah daripada str_replacekarena hanya memiliki 1 argumen, bukan 2.

Satu-satunya bagian yang sulit dalam contoh Anda adalah Anda ingin mempertahankan garis bawah tetapi mungkin: Anda harus mencocokkan ekspresi reguler hingga menemukan pola string yang ditentukan (?=pattern).

Lihat contoh:

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

[1] "_1121" "_1432" "_1121"
Kacang Agile
sumber
3

Berikut strsplitsolusi untuk dataframe menggunakan dplyrpaket

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
KK_63
sumber