ฉันจะลบบางส่วนของสตริงได้อย่างไร ยกตัวอย่างเช่นในฉันต้องการที่จะลบทุกอย่างก่อนATGAS_1121
_
ฉันจะลบบางส่วนของสตริงได้อย่างไร ยกตัวอย่างเช่นในฉันต้องการที่จะลบทุกอย่างก่อนATGAS_1121
_
คำตอบ:
ใช้นิพจน์ทั่วไป ในกรณีนี้คุณสามารถใช้gsub
:
gsub("^.*?_","_","ATGAS_1121")
[1] "_1121"
นิพจน์ทั่วไปนี้จับคู่กับจุดเริ่มต้นของสตริง (^) อักขระใด ๆ (.) ซ้ำศูนย์หรือมากกว่าครั้ง (*) และขีดล่าง (_) เดอะ? ทำให้การแข่งขัน "ขี้เกียจ" เพื่อให้การจับคู่มีค่าเท่าขีดล่างแรกเท่านั้น การแข่งขันนั้นจะถูกแทนที่ด้วยขีดล่าง ดู?regex
รายละเอียดเพิ่มเติมและข้อมูลอ้างอิง
คุณสามารถใช้ในตัวสำหรับสิ่งนี้strsplit :
> s = "TGAS_1121"
> s1 = unlist(strsplit(s, split='_', fixed=TRUE))[2]
> s1
[1] "1121"
strsplitผลตอบแทนที่ทั้งสองชิ้นของสตริงแยกวิเคราะห์บนแยกพารามิเตอร์เป็นรายการ นั่นอาจไม่ใช่สิ่งที่คุณต้องการดังนั้นให้ตัดการโทรในรายการที่ไม่อยู่ในรายการจากนั้นจัดทำดัชนีอาร์เรย์นั้นเพื่อให้ส่งคืนองค์ประกอบที่สองจากสององค์ประกอบในเวกเตอร์เท่านั้น
สุดท้ายควรตั้งค่าพารามิเตอร์คงที่เป็น TRUE เพื่อระบุว่าพารามิเตอร์การแบ่งไม่ใช่นิพจน์ทั่วไป แต่เป็นอักขระที่จับคู่ตามตัวอักษร
หากคุณเป็นคนประเภท 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"
นี่คือstrsplit
วิธีแก้ปัญหาหากs
เป็นเวกเตอร์:
> s <- c("TGAS_1121", "MGAS_1432")
> s1 <- sapply(strsplit(s, split='_', fixed=TRUE), function(x) (x[2]))
> s1
[1] "1121" "1432"
บางทีวิธีแก้ปัญหาที่ใช้งานง่ายที่สุดอาจเป็นการใช้stringr
ฟังก์ชันstr_remove
ซึ่งง่ายกว่าstr_replace
เนื่องจากมีเพียง 1 อาร์กิวเมนต์แทนที่จะเป็น 2
ส่วนที่ยุ่งยากเพียง แต่ในตัวอย่างของคุณคือการที่คุณต้องการที่จะให้ขีด แต่เป็นไปได้ที่: (?=pattern)
คุณจะต้องตรงกับการแสดงออกปกติจนกว่าจะพบรูปแบบสตริงที่ระบุ
ดูตัวอย่าง:
strings = c("TGAS_1121", "MGAS_1432", "ATGAS_1121")
strings %>% stringr::str_remove(".+?(?=_)")
[1] "_1121" "_1432" "_1121"
นี่คือ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
gsub("^.*_","_","ATGAS_1121_xxx")
ก่อนหน้านี้จะตรงกับขีดสุดท้ายในกรณีเช่นนั้น แก้ไขแล้ว