2015-03-02 12 views

Trả lời

5

Bạn đang thiếu thời gian:

as.numeric(gsub("[^[:digit:].]", "", c("2.11abc","15.1cde",".562342rfg"))) 
# [1] 2.110000 15.100000 0.562342 
+0

Cảm ơn bạn rất nhiều! –

+0

Mặc dù hãy cẩn thận nếu một khoảng thời gian có thể xảy ra ở bất kỳ nơi nào ngoài phần số của chuỗi (như trong "" 2.11abc.def "' hoặc '" a.b215 "', ví dụ) –

+0

@ JoshO'Brien Cảm ơn bạn đã chỉ ra điều đó. Tôi tìm thấy kịch bản đầu tiên ("2.11abc.def") đã tồn tại trong dữ liệu của tôi. Phải tìm ra cách khác. :( –

7

Nếu có các chuỗi rắc rối hơn, trong đó thời gian có thể xuất hiện bên ngoài của một phần số của chuỗi, bạn có thể muốn sử dụng một cái gì đó như thế này.

library(gsubfn) 

## A possibly more realistic character vector 
x <- c("2.11abc.def","a.b-15.1cde",".562342rfg", "abcdef") 

getNumberPart <- function(x) { 
    pat <- "(-?(\\d*\\.*\\d+|\\d+\\.))" 
    strapply(x, pattern=pat, FUN=as.numeric, simplify=TRUE, empty=NA) 
} 

getNumberPart(x) 
# [1] 2.110000 -15.100000 0.562342   NA 

Do lưu ý rằng nếu một chuỗi chứa nhiều hơn một số, strapply() sẽ trích xuất tất cả trong số họ, và sẽ trả lại kết quả tổng thể như một danh sách (chứ không phải là một vector đơn giản) với một yếu tố danh sách mỗi chuỗi đầu vào.

+0

Hoặc thông qua cơ sở: 'regmatches (x, regexpr (" (^ | \\ d +) \\. \\ d + ", x))' hoặc tương tự. – thelatemail

+0

@thelatemail - Vâng, và trên thực tế đó là những gì tôi Vấn đề là ở đây, mà âm thầm sẽ thả các chuỗi với * không * chữ số trong họ, mà có thể là khá phiền hà. 'strapply()' 's 'rỗng =' đối số giải quyết vấn đề này rất nhiều gọn gàng hơn tôi có thể với 'regmatches (regexpr())' –

+0

Đó là một chút phiền toái phải thừa nhận – thelatemail

1

Vì lợi ích của sự đơn giản sử dụng, tôi sẽ đề nghị xem xét gói "qdapRegex", mà bạn có thể làm:

x <- c("2.11abc.def","a.b15.1cde","-.562342rfg", "abcdef") 

library(qdapRegex) 
rm_number(x, extract = TRUE) 
# [[1]] 
# [1] "2.11" 
# 
# [[2]] 
# [1] "15.1" 
# 
# [[3]] 
# [1] "-.562342" 
# 
# [[4]] 
# [1] NA 
0

Điều này sẽ giúp.

a <- c("2.11abc","15.1cde",".562342rfg") 
substr(a, 1, regexpr("[a-zA-Z]", a)-1) 
Các vấn đề liên quan