แทนที่อักขระเฉพาะภายในสตริง


262

ฉันต้องการลบอักขระเฉพาะจากสตริงภายในเวกเตอร์ซึ่งคล้ายกับคุณลักษณะค้นหาและแทนที่ใน Excel

นี่คือข้อมูลที่ฉันเริ่มต้นด้วย:

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

ฉันเริ่มต้นด้วยคอลัมน์แรกเท่านั้น ฉันต้องการสร้างคอลัมน์ที่สองโดยลบe's:

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

คำตอบ:


399

ด้วยการแสดงออกปกติและฟังก์ชั่นgsub():

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

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

สิ่งที่gsubไม่นี่คือการเปลี่ยนการเกิดขึ้นของแต่ละกับสตริงที่ว่างเปล่า"e"""


ดู?regexpหรือgsubขอความช่วยเหลือเพิ่มเติม


15
fixed = TRUEจะทำให้เร็วขึ้น
Rich Scriven

4
@RichScriven คุณจะอธิบายเพิ่มเติมสั้น ๆ ว่าทำไม?
glaed

6
fixed=TRUEป้องกัน R จากการใช้นิพจน์ทั่วไปซึ่งช่วยให้การจับคู่รูปแบบมีความยืดหยุ่นมากขึ้น แต่ต้องใช้เวลาในการคำนวณ หากสิ่งที่ต้องการคือการลบสตริง "e" อย่างต่อเนื่องพวกเขาไม่จำเป็น
mm689

จะsub("e", "", group)ถือผลลัพธ์เดียวกันหรือไม่
Matheus Santana

จะแทนที่สิ่งแรกที่eพบในแต่ละองค์ประกอบ
sindri_baldur

47

การแสดงออกปกติเป็นเพื่อนของคุณ:

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

ตอนนี้ใช้gsub()กับรูปแบบการเปลี่ยนที่ง่ายที่สุดที่เป็นไปได้: สตริงว่าง:

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
อีกทั้ง ...require(stringr);group$groupNoE <- str_replace(group$group, "e", "")
dickoa

26
ฉันสามารถพูดได้ว่า "ผู้ที่ไม่เข้าใจฟังก์ชั่นพื้นฐานจะถูกแทนที่ด้วย" สิ่งที่ stringr จะได้รับที่นี่นอกเหนือจากการเพิ่มจำนวนขีดล่างในไฟล์ต้นฉบับของคุณ?
Dirk Eddelbuettel

8
" stringr เป็นชุดของตัวห่ออย่างง่ายที่ทำให้ฟังก์ชั่นสตริงของ R สอดคล้องกันมากขึ้นง่ายขึ้นและใช้งานง่ายขึ้น " จากผู้เขียนแพ็คเกจ ดังนั้นหากสิ่งที่คุณพูดนั้นเป็นความจริง (ขีดเส้นใต้จำนวนมากเพื่อห่อฟังก์ชันพื้นฐาน ... ) ไม่มีเหตุผลที่แพ็คเกจนี้จะมีอยู่ (ข้อจำกัดความรับผิดชอบ: ฉันใช้ฟังก์ชั่นฐาน regex เป็นหลัก แต่ฉันรู้ว่าพวกเขาอาจเป็นเรื่องยากสำหรับผู้ใช้ใหม่ ... )
dickoa

17
@dickoa: str_replacewraps subดังนั้นมันจะแทนที่รูปแบบที่เกิดขึ้นครั้งแรกเท่านั้น คุณจะต้องใช้หากคุณต้องการพฤติกรรมเช่นเดียวกับstr_replace_all gsub
Joshua Ulrich

24

สรุป 2 วิธีในการแทนที่สตริง:

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

1) การใช้งาน gsub

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

2) ใช้stringrแพ็คเกจ

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

ทั้งสองจะสร้างผลลัพธ์ที่ต้องการ:

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

3
ในเวลาที่คุณต้องอ่านทั้งหน้ารวมถึงความคิดเห็นเพื่อเรียนรู้ไวยากรณ์สำหรับ stringr วิธีที่ฉันชอบเพราะมันถูกกล่าวถึงเป็นส่วนใหญ่ในความคิดเห็น โซลูชันนี้แสดงตัวเลือกทั้งสองอย่างรวดเร็วซึ่งเป็นสาเหตุที่ฉันเสนอให้ ความหวังของฉันคือการช่วยเหลือผู้ใช้คนอื่น ๆ ในการกรองเหมือนฉันต้องทำเมื่อฉันยังใหม่กับอาร์ฉันต่อสู้กับ gsub ก่อนที่จะหา stringr เพราะมันไม่ได้กล่าวถึงในคำตอบที่ได้รับการตอบโต้อย่างมาก อีกครั้งวัตถุประสงค์คือไม่รวบรวม upvotes แต่พยายามช่วยผู้ใช้ R ใหม่
Megatron

หากคุณพบข้อมูลในคำตอบ / ความคิดเห็นอื่น ๆ ที่คุณพบว่ามีประโยชน์และต้องการแปลงเป็นคำตอบอย่างน้อยที่สุดคุณสามารถให้การระบุแหล่งที่มาเพื่อแสดงว่าคุณได้รับข้อมูลจาก / ทำคำตอบที่ Comminuty Wiki แทนเพียงแค่ทำให้ ของคุณเอง
David Arenburg

ขอบคุณ - จะจำไว้ในครั้งต่อไป ไม่เคยทำวิกิชุมชนมาก่อนเลยไม่รู้เลยว่ามันเป็นตัวเลือก
Megatron

1
ตัวเลือก 2 ใช้งานได้ดีเมื่อนำไปใช้กับคอลัมน์ข้อมูลในกรอบข้อมูลโดยไม่ระบุค่าทั้งหมดในคอลัมน์ เห็นได้ชัดว่าตัวเลือกที่ 1 คือการทำซ้ำ แต่ตัวเลือกที่ 2 ทำงานได้ดีมากและสมควรได้รับการโหวตสำหรับการใช้งานที่เพิ่มขึ้น
Phil_T

6

คุณไม่จำเป็นต้องสร้าง data frame จาก vector ของสตริงถ้าคุณต้องการแทนที่ตัวอักษรบางตัวในนั้น นิพจน์ทั่วไปเป็นตัวเลือกที่ดีเพราะได้รับการกล่าวถึงแล้วโดย @Andrie และ @Dirk Eddelbuettel

ระวังถ้าคุณต้องการแทนที่อักขระพิเศษเช่นจุดคุณควรใช้ไวยากรณ์นิพจน์ปกติแบบเต็มดังแสดงในตัวอย่างด้านล่าง:

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

นี้จะผลิต

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

คุณสามารถหนีพวกมันได้ แต่คุณต้องหลบหนีเช่นกันเพราะตัวละครอยู่ในเครื่องหมายคำพูด:gsub("\\.", " ", ctr_names)
Kamil S Jaron

4

ใช้แพ็คเกจ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" 
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.