Bagaimana cara menghapus bagian dari string? Misalnya di ATGAS_1121Saya 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 ?regexuntuk 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 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"
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"
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
gsub("^.*_","_","ATGAS_1121_xxx"),. Sekarang sudah diperbaiki.