Ganti karakter tertentu dalam string


262

Saya ingin menghapus karakter tertentu dari string dalam vektor, mirip dengan fitur Temukan dan Ganti di Excel.

Berikut adalah data yang saya mulai dengan:

group <- data.frame(c("12357e", "12575e", "197e18", "e18947")

Saya mulai dengan hanya kolom pertama; Saya ingin menghasilkan kolom kedua dengan menghapus e's:

group       group.no.e
12357e      12357
12575e      12575
197e18      19718
e18947      18947

Jawaban:


399

Dengan ekspresi reguler dan fungsinya gsub():

group <- c("12357e", "12575e", "197e18", "e18947")
group
[1] "12357e" "12575e" "197e18" "e18947"

gsub("e", "", group)
[1] "12357" "12575" "19718" "18947"

Apa yang gsubdilakukan di sini adalah mengganti setiap kemunculan "e"dengan string kosong "".


Lihat ?regexpatau gsubuntuk bantuan lebih lanjut.


15
fixed = TRUEakan membuat ini lebih cepat.
Rich Scriven

4
@RichScriven dapat Anda jelaskan mengapa?
glaed

6
fixed=TRUEmencegah R dari menggunakan ekspresi reguler, yang memungkinkan pencocokan pola yang lebih fleksibel tetapi membutuhkan waktu untuk menghitung. Jika semua yang diperlukan adalah menghapus satu string konstan "e", mereka tidak perlu.
mm689

Apakah akan sub("e", "", group)menghasilkan hasil yang sama?
Matheus Santana

hanya akan menggantikan yang pertama editemukan di setiap elemen
sindri_baldur

47

Ekspresi reguler adalah teman Anda:

R> ## also adds missing ')' and sets column name
R> group<-data.frame(group=c("12357e", "12575e", "197e18", "e18947"))  )
R> group
   group
1 12357e
2 12575e
3 197e18
4 e18947

Sekarang gunakan gsub()dengan pola penggantian sesederhana mungkin: string kosong:

R> group$groupNoE <- gsub("e", "", group$group)
R> group
   group groupNoE
1 12357e    12357
2 12575e    12575
3 197e18    19718
4 e18947    18947
R> 

3
Juga ...require(stringr);group$groupNoE <- str_replace(group$group, "e", "")
dickoa

26
Yah, saya bisa terkekeh bahwa "Mereka yang tidak mengerti fungsi dasar ditakdirkan untuk menggantinya". Apa sebenarnya yang didapat stringr di sini, selain meningkatkan jumlah garis bawah dalam file sumber Anda?
Dirk Eddelbuettel

8
" stringr adalah satu set pembungkus sederhana yang membuat fungsi string R lebih konsisten, lebih sederhana dan lebih mudah digunakan " dari pembuat paket. Jadi jika apa yang Anda katakan itu benar (banyak garis bawah untuk membungkus fungsi basis ...) tidak ada alasan untuk paket ini ada (disclaimer: Saya terutama menggunakan fungsi regex basis tetapi saya tahu bahwa itu bisa menyulitkan bagi pengguna baru ... )
dickoa

17
@dickoa: str_replacemembungkus sub, jadi itu hanya akan menggantikan kemunculan pola yang pertama. Anda perlu menggunakan str_replace_alljika Anda menginginkan perilaku yang sama gsub.
Joshua Ulrich

24

Meringkas 2 cara untuk mengganti string:

group<-data.frame(group=c("12357e", "12575e", "197e18", "e18947"))

1) Gunakan gsub

group$group.no.e <- gsub("e", "", group$group)

2) Gunakan stringrpaket

group$group.no.e <- str_replace_all(group$group, "e", "")

Keduanya akan menghasilkan output keinginan:

   group group.no.e
1 12357e      12357
2 12575e      12575
3 197e18      19718
4 e18947      18947

3
Pada saat itu Anda harus membaca seluruh halaman termasuk komentar untuk mempelajari sintaks untuk stringr, metode pilihan saya, karena sebagian besar dibahas dalam komentar. Solusi ini dengan cepat menghadirkan kedua opsi, itulah sebabnya saya menawarkannya. Harapan saya adalah membantu pengguna lain menyaring banyak seperti yang harus saya lakukan ketika saya masih baru di R. Saya berjuang dengan gsub sebelum menemukan stringr karena itu tidak disebutkan dalam jawaban yang sangat terunggul. Sekali lagi, tujuannya bukan untuk mengumpulkan upvotes tetapi mencoba untuk membantu pengguna R baru keluar.
Megatron

Jika Anda menemukan informasi dalam jawaban / komentar lain yang Anda anggap berguna dan ingin dikonversi menjadi jawaban, Anda setidaknya bisa memberikan atribusi untuk menunjukkan dari mana Anda mendapatkan informasi dari / menjadikan jawaban itu sebagai Comminuty Wiki alih-alih menjadikannya sebagai milikmu.
David Arenburg

Terima kasih - akan selalu diingat untuk waktu berikutnya. Belum pernah membuat komunitas wiki sebelumnya, jadi tidak tahu itu pilihan.
Megatron

1
Opsi 2 berfungsi dengan baik ketika diterapkan pada kolom data dalam bingkai data, tanpa menentukan semua nilai dalam kolom. Jelas opsi 1 adalah pengulangan, tetapi opsi 2 bekerja dengan sangat baik, dan layak mendapatkan suara untuk fungsi tambahan.
Phil_T

6

Anda tidak perlu membuat bingkai data dari vektor string, jika Anda ingin mengganti beberapa karakter di dalamnya. Ekspresi reguler adalah pilihan yang baik karena sudah disebutkan oleh @Andrie dan @Dirk Eddelbuettel.

Perhatikan, jika Anda ingin mengganti karakter khusus, seperti titik, Anda harus menggunakan sintaks ekspresi reguler penuh, seperti yang ditunjukkan dalam contoh di bawah ini:

ctr_names <- c("Czech.Republic","New.Zealand","Great.Britain")
gsub("[.]", " ", ctr_names)

ini akan menghasilkan

[1] "Czech Republic" "New Zealand"    "Great Britain" 

Anda dapat melarikan diri dari mereka, tetapi Anda harus melarikan diri juga karakter melarikan diri karena itu dalam tanda kutip:gsub("\\.", " ", ctr_names)
Kamil S Jaron

4

Gunakan paket stringi :

require(stringi)

group<-data.frame(c("12357e", "12575e", "197e18", "e18947"))
stri_replace_all(group[,1], "", fixed="e")
[1] "12357" "12575" "19718" "18947"

0
      library(stringi)

            group <- c('12357e', '12575e', '12575e', ' 197e18',  'e18947')

            pattern <- "e"  
            replacement <-  ""  
            group <- str_replace(group, pattern, replacement)      
            group    

[1] "12357"  "12575"  "12575"  " 19718" "18947" 
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.