2012-08-13 14 views
178

Tôi muốn xóa các ký tự cụ thể khỏi các chuỗi trong một vectơ, tương tự như tính năng Tìm và thay thế trong Excel.Trong R, thay thế văn bản trong một chuỗi

Sau đây là các dữ liệu tôi bắt đầu với:

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

tôi bắt đầu chỉ với cột đầu tiên; Tôi muốn tạo ra cột thứ hai bằng cách loại bỏ các e 's:

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

Trả lời

279

Với một biểu thức chính quy và chức năng gsub():

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

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

gsub làm ở đây là để thay thế từng xảy ra "e" với một chuỗi rỗng "".


Xem ?regexp hoặc gsub để được trợ giúp thêm.

+8

'cố định = TRUE' sẽ làm cho điều này nhanh hơn. –

+2

@RichScriven bạn có thể nhanh chóng giải thích tại sao không? – glaed

+3

'fixed = TRUE' ngăn R sử dụng cụm từ thông dụng, cho phép đối sánh mẫu linh hoạt hơn nhưng mất thời gian để tính toán. Nếu tất cả những gì cần thiết là loại bỏ một chuỗi liên tục "e", chúng không cần thiết. – mm689

36

Biểu thức thông thường bạn bè:

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 

Bây giờ sử dụng gsub() với mô hình thay thế đơn giản nhất có thể: chuỗi rỗng:

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

Ngoài ra ...'require (stringr); nhóm $ groupNoE <- str_replace (nhóm $ group," e "," ")' – dickoa

+23

Vâng, tôi có thể snicker rằng "Những người không hiểu chức năng cơ bản sẽ phải chịu số phận thay thế chúng". Chính xác những gì hiện stringr đạt được ở đây, bên cạnh việc tăng số lượng dấu gạch dưới trong tập tin nguồn của bạn? –

+7

"** stringr là một bộ các trình bao bọc đơn giản giúp các hàm chuỗi R phù hợp hơn, đơn giản hơn và dễ sử dụng hơn **" từ tác giả của gói. Vì vậy, nếu những gì bạn nói là đúng (nhiều dấu gạch dưới để bọc các hàm cơ sở ...) không có lý do gì cho gói này tồn tại (từ chối trách nhiệm: Tôi chủ yếu sử dụng các hàm cơ sở regex nhưng tôi biết rằng chúng có thể khó khăn đối với người dùng mới ...) – dickoa

15

Tóm tắt 2 cách để thay thế chuỗi:

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

1) Sử dụng gsub

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

2) Sử dụng các gói stringr

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

Cả hai sẽ cho kết quả mong muốn:

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

'gsub()' đã được đề cập trong cả hai câu trả lời khác –

+2

Đồng thời bạn phải đọc toàn bộ trang bao gồm các nhận xét để tìm hiểu cú pháp cho stringr, phương thức ưa thích của tôi, vì nó hầu như được thảo luận trong các nhận xét. Giải pháp này nhanh chóng trình bày cả hai lựa chọn, đó là lý do tại sao tôi cung cấp nó. Hy vọng của tôi là giúp những người dùng khác lọc qua nhiều thứ như tôi phải làm khi tôi còn mới R. Tôi đã gặp khó khăn với gsub trước khi tìm ra stringr * vì * nó không được đề cập trong một câu trả lời được đánh giá cao. Một lần nữa, mục tiêu không phải là để thu thập upvotes nhưng cố gắng giúp đỡ người dùng R mới ra ngoài. – Megatron

+0

Nếu bạn tìm thấy thông tin trong các câu trả lời/nhận xét khác mà bạn thấy hữu ích và muốn chuyển đổi thành câu trả lời, ít nhất bạn có thể cung cấp một số phân bổ để hiển thị thông tin từ/tạo câu trả lời cho Comminuty Wiki thay vì chỉ làm cho nó như của riêng bạn. –

2

Sử dụng stringi gói:

require(stringi) 

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

Bạn không cần phải tạo khung dữ liệu từ vectơ của dây, nếu bạn muốn thay thế một số ký tự trong đó. Biểu thức chính quy là lựa chọn tốt cho nó vì nó đã được đề cập bởi @Andrie và @Dirk Eddelbuettel.

Chú ý, nếu bạn muốn thay thế ký tự đặc biệt, giống như dấu chấm, bạn nên sử dụng đầy đủ cú pháp biểu thức chính quy, như trong ví dụ dưới đây:

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

này sẽ sản xuất

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