Tôi có chuỗi như thế này:
years<-c("20 years old", "1 years old")
Tôi chỉ muốn ghi số lượng từ vectơ này. Đầu ra mong đợi là một vectơ:
c(20, 1)
Làm thế nào để tôi làm điều này?
Tôi có chuỗi như thế này:
years<-c("20 years old", "1 years old")
Tôi chỉ muốn ghi số lượng từ vectơ này. Đầu ra mong đợi là một vectơ:
c(20, 1)
Làm thế nào để tôi làm điều này?
Câu trả lời:
Làm thế nào về
# pattern is by finding a set of numbers in the start and capturing them
as.numeric(gsub("([0-9]+).*$", "\\1", years))
hoặc là
# pattern is to just remove _years_old
as.numeric(gsub(" years old", "", years))
hoặc là
# split by space, get the element in first index
as.numeric(sapply(strsplit(years, " "), "[[", 1))
.*
là cần thiết vì bạn cần khớp toàn bộ chuỗi. Không có điều đó, không có gì bị loại bỏ. Ngoài ra, lưu ý rằng sub
có thể được sử dụng ở đây thay vì gsub
.
gsub(".*?([0-9]+).*", "\\1", years)
gsub(".*?([0-9]+).*?", "\\1", "Jun. 27–30")
Kết quả: [1] "2730" gsub(".*?([0-9]+)\\-.*?", "\\1", "Jun. 27–30")
Kết quả: [1] "Tháng 6 27 –30 "
Tôi nghĩ rằng thay thế là một cách gián tiếp để đạt được giải pháp. Nếu bạn muốn truy xuất tất cả các số, tôi khuyên bạn nên gregexpr
:
matches <- regmatches(years, gregexpr("[[:digit:]]+", years))
as.numeric(unlist(matches))
Nếu bạn có nhiều kết quả phù hợp trong một chuỗi, điều này sẽ nhận được tất cả chúng. Nếu bạn chỉ quan tâm đến trận đấu đầu tiên, hãy sử dụng regexpr
thay vì gregexpr
và bạn có thể bỏ qua unlist
.
gregexpr
, regexpr
hay cả hai?
gregexpr
. Tôi đã không cố gắng regexpr
cho đến bây giờ. Sự khác biệt lớn. Sử dụng regexpr
đặt nó giữa các giải pháp của Andrew và Arun (nhanh thứ hai) trên tập 1e6. Có lẽ cũng thú vị, sử dụng sub
trong giải pháp của Andrew không cải thiện tốc độ.
Cập nhật
Vì extract_numeric
không được dùng nữa, chúng tôi có thể sử dụng parse_number
từ readr
gói.
library(readr)
parse_number(years)
Đây là một tùy chọn khác với extract_numeric
library(tidyr)
extract_numeric(years)
#[1] 20 1
parse_number
không chơi với số âm. Hãy thử parse_number("–27,633")
readr::parse_number("-12,345") # [1] -12345
Bạn cũng có thể loại bỏ tất cả các chữ cái:
as.numeric(gsub("[[:alpha:]]", "", years))
Tuy nhiên, có vẻ như điều này ít khái quát hơn.
Trích xuất số từ bất kỳ chuỗi nào ở vị trí đầu.
x <- gregexpr("^[0-9]+", years) # Numbers with any number of digits
x2 <- as.numeric(unlist(regmatches(years, x)))
Trích xuất số từ bất kỳ chuỗi ĐỘC LẬP của vị trí.
x <- gregexpr("[0-9]+", years) # Numbers with any number of digits
x2 <- as.numeric(unlist(regmatches(years, x)))
Chúng tôi cũng có thể sử dụng str_extract
từstringr
years<-c("20 years old", "1 years old")
as.integer(stringr::str_extract(years, "\\d+"))
#[1] 20 1
Nếu có nhiều số trong chuỗi và chúng tôi muốn trích xuất tất cả chúng, chúng tôi có thể sử dụng str_extract_all
mà không giống như str_extract
trả về tất cả macthes.
years<-c("20 years old and 21", "1 years old")
stringr::str_extract(years, "\\d+")
#[1] "20" "1"
stringr::str_extract_all(years, "\\d+")
#[[1]]
#[1] "20" "21"
#[[2]]
#[1] "1"
Sau bài đăng từ Gabor Grothendieck đăng tại danh sách gửi thư trợ giúp r
years<-c("20 years old", "1 years old")
library(gsubfn)
pat <- "[-+.e0-9]*\\d"
sapply(years, function(x) strapply(x, pat, as.numeric)[[1]])
Sử dụng gói unglue chúng ta có thể làm:
# install.packages("unglue")
library(unglue)
years<-c("20 years old", "1 years old")
unglue_vec(years, "{x} years old", convert = TRUE)
#> [1] 20 1
Được tạo vào ngày 11 tháng 11 năm 2019 bởi gói reprex (v0.3.0)
Thông tin thêm: https://github.com/moodymudskipper/unglue/blob/master/README.md
.*
cần thiết? Nếu bạn muốn chúng ngay từ đầu, tại sao không sử dụng^[[:digit:]]+
?