ลบส่วนหนึ่งของสตริง


90

ฉันจะลบบางส่วนของสตริงได้อย่างไร ยกตัวอย่างเช่นในฉันต้องการที่จะลบทุกอย่างก่อนATGAS_1121_

คำตอบ:


133

ใช้นิพจน์ทั่วไป ในกรณีนี้คุณสามารถใช้gsub:

gsub("^.*?_","_","ATGAS_1121")
[1] "_1121"

นิพจน์ทั่วไปนี้จับคู่กับจุดเริ่มต้นของสตริง (^) อักขระใด ๆ (.) ซ้ำศูนย์หรือมากกว่าครั้ง (*) และขีดล่าง (_) เดอะ? ทำให้การแข่งขัน "ขี้เกียจ" เพื่อให้การจับคู่มีค่าเท่าขีดล่างแรกเท่านั้น การแข่งขันนั้นจะถูกแทนที่ด้วยขีดล่าง ดู?regexรายละเอียดเพิ่มเติมและข้อมูลอ้างอิง


6
regex gsub("^.*_","_","ATGAS_1121_xxx")ก่อนหน้านี้จะตรงกับขีดสุดท้ายในกรณีเช่นนั้น แก้ไขแล้ว
Richie Cotton

7
@ โจชัวฉันคิดว่ามันมีประโยชน์มากที่คุณอธิบายบทบาทของนิพจน์ทั่วไป
Vasile

นอกจากนี้ยังใช้ได้กับเวกเตอร์ของสตริงเป็นอาร์กิวเมนต์สุดท้าย R น่ากลัวแบบนั้น
naught101

37

คุณสามารถใช้ในตัวสำหรับสิ่งนี้strsplit :

> s = "TGAS_1121"
> s1 = unlist(strsplit(s, split='_', fixed=TRUE))[2]
> s1    
 [1] "1121"

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

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


23

หากคุณเป็นคนประเภท Tidyverse นี่คือโซลูชันสตริง :

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"

21

นี่คือstrsplitวิธีแก้ปัญหาหากsเป็นเวกเตอร์:

> s <- c("TGAS_1121", "MGAS_1432")
> s1 <- sapply(strsplit(s, split='_', fixed=TRUE), function(x) (x[2]))
> s1
[1] "1121" "1432"

2
มีประโยชน์มากขอบคุณ! FYI เพื่อรับส่วนแรกของสตริง (เช่นก่อน '_') ให้แทนที่ [2] ที่ท้ายด้วย [1]
stevenjoe

4

บางทีวิธีแก้ปัญหาที่ใช้งานง่ายที่สุดอาจเป็นการใช้stringrฟังก์ชันstr_removeซึ่งง่ายกว่าstr_replaceเนื่องจากมีเพียง 1 อาร์กิวเมนต์แทนที่จะเป็น 2

ส่วนที่ยุ่งยากเพียง แต่ในตัวอย่างของคุณคือการที่คุณต้องการที่จะให้ขีด แต่เป็นไปได้ที่: (?=pattern)คุณจะต้องตรงกับการแสดงออกปกติจนกว่าจะพบรูปแบบสตริงที่ระบุ

ดูตัวอย่าง:

strings = c("TGAS_1121", "MGAS_1432", "ATGAS_1121")
strings %>% stringr::str_remove(".+?(?=_)")

[1] "_1121" "_1432" "_1121"

3

นี่คือstrsplitวิธีแก้ปัญหาสำหรับดาต้าเฟรมโดยใช้dplyrแพ็คเกจ

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