วิธีลบอักขระ n ตัวสุดท้ายออกจากทุกองค์ประกอบในเวกเตอร์ R


107

ฉันใหม่มากสำหรับ R และฉันไม่พบตัวอย่างง่ายๆทางออนไลน์เกี่ยวกับวิธีการลบอักขระ n ตัวสุดท้ายออกจากทุกองค์ประกอบของเวกเตอร์ (อาร์เรย์?)

ฉันมาจากพื้นหลัง Java ดังนั้นสิ่งที่ฉันต้องการจะทำคือทำซ้ำทุกองค์ประกอบa$dataและลบอักขระ 3 ตัวสุดท้ายออกจากทุกองค์ประกอบ

คุณจะไปได้อย่างไร?

คำตอบ:


116

นี่คือตัวอย่างของสิ่งที่ฉันจะทำ ฉันหวังว่ามันจะเป็นสิ่งที่คุณกำลังมองหา

char_array = c("foo_bar","bar_foo","apple","beer")
a = data.frame("data"=char_array,"data2"=1:4)
a$data = substr(a$data,1,nchar(a$data)-3)

ตอนนี้ควรมี:

  data data2
1 foo_ 1
2 bar_ 2
3   ap 3
4    b 4

น่าสนุกฉันต้องเปลี่ยน-3เพื่อ-0ให้ได้เอฟเฟกต์ที่ต้องการ! ฉันมีข้อมูลมากมายพร้อมวันที่เช่น"2014-03-27 23:00:00 GMT" "2014-03-31 00:00:00 BST"- ใช่สองเขตเวลาด้วยกันและฟังก์ชัน as.Date กำลังส่งคืนผลลัพธ์ที่ไม่คาดคิด (วันก่อนหน้าสำหรับวันที่ BST) - ดังนั้นฉันจึงต้องการลบการประทับเขตเวลาปรากฎว่าฉันต้อง ทำ-0และมันจะหายไปพร้อมกับชั่วโมง
LucasSeveryn

ลองพิจารณาฟังก์ชั่น strptime ด้วยฉันไม่เคยใช้เขตเวลามาก่อน ฉันคิดว่ามันอาจจะรับรู้ได้ สมมติว่า "% Z" รับรู้เขตเวลา ฉันยังลบฟังก์ชัน sapply ฉันลืมไปแล้วว่า R ชอบทำเวกเตอร์ของฟังก์ชันมากแค่ไหน
nfmcclure

@LucasSeveryn หากคุณต้องการแปลงการแสดงเวลาของอักขระเป็นวันที่โดยคำนึงถึงเขตเวลาโปรดแก้ไขเป็นคำถามของคุณ น่าจะมีคำตอบที่ดีกว่าที่จะนำคุณไปสู่ผลลัพธ์ที่คุณต้องการโดยตรง (เช่นstrptime)
Blue Magister

85

นี่คือวิธีgsub:

cs <- c("foo_bar","bar_foo","apple","beer")
gsub('.{3}$', '', cs)
# [1] "foo_" "bar_" "ap"   "b"

4
(+1) แฟนตัวยงของ regex สามารถใช้ได้กับเกือบทุกอย่าง
Rich Scriven

8
หมายเหตุ: สิ่งนี้จะส่งคืนสตริงเดิมหากยาวกว่าแล้วจำนวนอักขระที่จะตัด พิจารณาgsub('.{5}$', '', 'abcd').
Tomas Greif

32

แม้ว่าส่วนใหญ่จะเหมือนกันกับคำตอบของ @nfmcclure แต่ฉันชอบใช้stringrแพคเกจเนื่องจากมีชุดของฟังก์ชันที่มีชื่อสอดคล้องและสื่อความหมายได้ดีกว่าที่อยู่ในฐาน R (อันที่จริงฉันมักจะใช้ google สำหรับ"วิธีรับจำนวน ตัวอักษร R "เพราะจำชื่อไม่ได้nchar())

library(stringr)
str_sub(iris$Species, end=-4)
#or 
str_sub(iris$Species, 1, str_length(iris$Species)-3)

ซึ่งจะลบอักขระ 3 ตัวสุดท้ายออกจากแต่ละค่าในSpeciesคอลัมน์


22
ด้วยstringrแพคเกจมีวิธีแก้ปัญหาที่ง่ายกว่า: str_sub(iris$Species, end=-4)
jan-glx

14

อาจทำได้เช่นเดียวกันกับแพ็คเกจstringi :

library('stringi')
char_array <- c("foo_bar","bar_foo","apple","beer")
a <- data.frame("data"=char_array, "data2"=1:4)
(a$data <- stri_sub(a$data, 1, -4)) # from the first to the last but 4th char
## [1] "foo_" "bar_" "ap"   "b" 

3

คล้ายกับ @Matthew_Plourde โดยใช้ไฟล์ gsub

อย่างไรก็ตามการใช้รูปแบบที่จะตัดให้เหลืออักขระศูนย์เช่น return "" หากสตริงเดิมสั้นกว่าจำนวนอักขระที่จะตัด:

cs <- c("foo_bar","bar_foo","apple","beer","so","a")
gsub('.{0,3}$', '', cs)
# [1] "foo_" "bar_" "ap"   "b"    ""    ""

ความแตกต่างคือ{0,3}ตัวบ่งชี้บ่งชี้การจับคู่ 0 ถึง 3 ในขณะที่{3}ต้องมีการแข่งขัน 3 รายการเท่านั้นมิฉะนั้นจะไม่พบรายการที่ตรงกันgsubจะส่งคืนสตริงดั้งเดิมที่ไม่ได้แก้ไข

การใช้ NB {,3}จะเทียบเท่ากับ{0,3}ฉันเพียงแค่ชอบสัญกรณ์หลัง

ดูข้อมูลเพิ่มเติมเกี่ยวกับ regex quantifiers ได้ที่นี่: https://www.regular-expressions.info/refrepeat.html


คุณสามารถใช้sub()แทนgsub().
sindri_baldur
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.