Thay thế các ký tự cụ thể trong chuỗi


262

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.

Dưới đây là 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 cột thứ hai bằng cách xóa e's:

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

Câu trả lời:


399

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

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

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

Điều gì gsubở đây là để thay thế mỗi lần xuất hiện "e"bằng một chuỗi rỗng "".


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


15
fixed = TRUEsẽ làm điều này nhanh hơn.
Rich Scriven

4
@RichScriven bạn có thể giải thích ngắn gọn tại sao?
dán vào

6
fixed=TRUEngăn R sử dụng các biểu thức chính quy, cho phép khớp 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 "e" không đổi, thì chúng không cần thiết.
mm689

Sẽ sub("e", "", group)giữ kết quả tương tự?
Matheus Santana

sẽ chỉ thay thế cái đầu tiên enó tìm thấy trong mỗi phần tử
sindri_baldur

47

Biểu thức thông thường là bạn bè của bạn:

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ẫu 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> 

3
Ngoài ra ...require(stringr);group$groupNoE <- str_replace(group$group, "e", "")
Dickoa

26
Chà, tôi có thể cười thầm rằng "Những người không hiểu các chức năng cơ bản sẽ phải chịu số phận thay thế chúng". Chính xác thì chuỗirr đạt được gì ở đây, ngoài việc tăng số lượng dấu gạch dưới trong tệp nguồn của bạn?
Dirk Eddelbuettel

8
" Stringr là một tập hợp các hàm bao đơn giản làm cho các hàm chuỗi của R trở nên nhất quán 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ở ...) thì không có lý do gì để 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 regex cơ sở nhưng tôi biết rằng chúng có thể gây khó khăn cho người dùng mới ... )
Dickoa

17
@dickoa: str_replacekết thúc tốt đẹp sub, vì vậy nó sẽ chỉ thay thế lần xuất hiện đầu tiên của mẫu. Bạn sẽ cần phải sử dụng str_replace_allnếu bạn muốn hành vi tương tự như gsub.
Joshua Ulrich

24

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 stringrgói

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

Cả hai sẽ tạo ra đầu ra mong muốn:

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

3
Tại thời điểm đó bạn phải đọc toàn bộ trang bao gồm các bình luận để tìm hiểu cú pháp cho chuỗi, phương pháp ưa thích của tôi, vì nó chủ yếu được thảo luận trong các bình luận. 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ứ giống như tôi phải làm khi tôi mới sử dụng R. Tôi đã vật lộn với gsub trước khi tìm chuỗi nó không được đề cập trong 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 upvote mà cố gắng giúp người dùng R mới.
Megatron

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ố ghi nhận để hiển thị nơi bạn đã lấy thông tin từ / tạo câu trả lời cho Wiki Comminuty thay vì chỉ đưa ra như của riêng bạn
David Arenburg

Cảm ơn - sẽ ghi nhớ cho lần sau. Chưa bao giờ tạo wiki cộng đồng trước đây, vì vậy không biết đó là một lựa chọn.
Megatron

1
Tùy chọn 2 hoạt động tuyệt vời khi được áp dụng cho một cột dữ liệu trong khung dữ liệu mà không chỉ định tất cả các giá trị trong cột. Rõ ràng tùy chọn 1 là lặp lại, nhưng tùy chọn 2 hoạt động rất tốt và xứng đáng được bình chọn cho chức năng được thêm vào.
Phil_T

6

Bạn không cần tạo khung dữ liệu từ vectơ của chuỗi, 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.

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

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

cái này sẽ tạo ra

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

Bạn chỉ có thể thoát khỏi chúng, nhưng bạn cũng phải thoát khỏi nhân vật thoát vì nó được trích dẫn:gsub("\\.", " ", ctr_names)
Kamil S Jaron

4

Sử dụng gói 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" 
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.