Hapus bagian dari string


90

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

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


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.


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"

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"

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"

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.