Bagaimana cara menghapus bagian dari string? Misalnya di ATGAS_1121
Saya ingin menghapus semuanya sebelumnya _
.
90
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
gsub("^.*_","_","ATGAS_1121_xxx")
,. Sekarang sudah diperbaiki.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.
sumber
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"
sumber
Berikut
strsplit
solusinya jikas
adalah vektor:> s <- c("TGAS_1121", "MGAS_1432") > s1 <- sapply(strsplit(s, split='_', fixed=TRUE), function(x) (x[2])) > s1 [1] "1121" "1432"
sumber
Mungkin solusi paling intuitif mungkin menggunakan
stringr
fungsistr_remove
yang bahkan lebih mudah daripadastr_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"
sumber
Berikut
strsplit
solusi untuk dataframe menggunakandplyr
paketcol1 = 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
sumber