Cách xóa n ký tự cuối cùng khỏi mọi phần tử trong vectơ R


106

Tôi rất mới với R và tôi không thể tìm thấy một ví dụ đơn giản trực tuyến về cách xóa n ký tự cuối cùng khỏi mọi phần tử của vectơ (mảng?)

Tôi đến từ nền tảng Java, vì vậy những gì tôi muốn làm là lặp lại mọi phần tử của a$datavà loại bỏ 3 ký tự cuối cùng khỏi mọi phần tử.

Bạn sẽ đi về nó như thế nào?

Câu trả lời:


115

Đây là một ví dụ về những gì tôi sẽ làm. Tôi hy vọng đó là những gì bạn đang tìm kiếm.

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)

một bây giờ nên chứa:

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

Hoạt kê, tôi đã phải thay đổi -3để -0có được hiệu quả mong muốn! Tôi có rất nhiều dữ liệu với ngày tháng, như: "2014-03-27 23:00:00 GMT" "2014-03-31 00:00:00 BST"- vâng, hai múi giờ cùng nhau và hàm as.Date trả về kết quả không mong muốn (sớm hơn một ngày đối với các ngày BST) - do đó tôi muốn xóa tem múi giờ, hóa ra tôi phải làm -0và nó biến mất, cùng với hàng giờ
LucasSeveryn

Ngoài ra, hãy xem xét chức năng strptime, tôi chưa sử dụng múi giờ trước đây. Tôi nghĩ nó có thể nhận ra nó. Được cho là "% Z" nhận dạng múi giờ. Tôi cũng đã loại bỏ chức năng sapply. Tôi quên rằng R thích vectơ hóa các chức năng của nó như thế nào.
nfmcclure

@LucasSeveryn Nếu bạn muốn chuyển đổi biểu diễn thời gian của ký tự thành ngày có tính đến múi giờ, vui lòng chỉnh sửa nó thành câu hỏi của bạn. Có thể có những câu trả lời tốt hơn sẽ đưa bạn trực tiếp đến kết quả mong muốn của bạn (chẳng hạn như strptime).
Blue Magister

84

Đây là một cách với gsub:

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

4
(+1) Fan cuồng của regex. Nó có thể được sử dụng trên hầu hết mọi thứ.
Rich Scriven

8
Lưu ý: Điều này trả về chuỗi ban đầu nếu nó dài hơn thì số ký tự cần cắt. Hãy cân nhắc gsub('.{5}$', '', 'abcd').
Tomas Greif

32

Mặc dù điều này hầu hết giống với câu trả lời của @nfmcclure, tôi thích sử dụng stringrgói hơn vì nó cung cấp một tập hợp các hàm có tên nhất quán và mang tính mô tả cao hơn so với các hàm trong cơ sở R (trên thực tế, tôi luôn tìm kiếm "cách lấy số ký tự trong R " vì tôi không thể nhớ tên nchar()).

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

Thao tác này sẽ xóa 3 ký tự cuối cùng khỏi mỗi giá trị tại Speciescột.


22
với stringrgói có một giải pháp đơn giản hơn: str_sub(iris$Species, end=-4)
Jan-glx

13

Điều tương tự có thể đạt được với gói 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" 

2

Tương tự với @Matthew_Plourde bằng cách sử dụng gsub

Tuy nhiên, sử dụng một mẫu sẽ cắt thành không ký tự, tức là trả về "" nếu chuỗi gốc ngắn hơn số ký tự cần cắt:

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

Sự khác biệt là, bộ {0,3}định lượng chỉ ra từ 0 đến 3 kết quả phù hợp, trong khi {3}yêu cầu chính xác 3 kết quả phù hợp, nếu không sẽ không tìm thấy kết quả phù hợp nào trong trường hợp này gsubtrả về chuỗi ban đầu, không được sửa đổi.

NB sử dụng {,3}sẽ tương đương với {0,3}, tôi chỉ đơn giản thích ký hiệu sau hơn.

Xem tại đây để biết thêm thông tin về bộ định lượng regex: https://www.regular-expressions.info/refrepeat.html

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.