Bagaimana cara menghapus bagian dari string? Misalnya di ATGAS_1121
Saya ingin menghapus semuanya sebelumnya _
.
Jawaban:
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 ?regex
untuk lebih jelasnya dan referensi
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.
Berikut strsplit
solusinya jika s
adalah vektor:
> s <- c("TGAS_1121", "MGAS_1432")
> s1 <- sapply(strsplit(s, split='_', fixed=TRUE), function(x) (x[2]))
> s1
[1] "1121" "1432"
Mungkin solusi paling intuitif mungkin menggunakan stringr
fungsi str_remove
yang bahkan lebih mudah daripada str_replace
karena 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"
Berikut strsplit
solusi untuk dataframe menggunakan dplyr
paket
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")
,. Sekarang sudah diperbaiki.