2015-03-02 14 views
8

例如拆分十進制數:如何從一個串中的R

c("2.11abc","15.1cde",".562342rfg") 

如何將數字分裂出來此向量的? 我想擁有的載體是

c(2.11, 15.1, 0.562342) 

我試圖

gsub("[^[:digit:]]", "", a) 

但結果卻是

c(211, 151 ,562342) 

我真的很感謝你的幫助。

回答

5

你缺少的時期:

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

非常感謝! – 2015-03-02 21:34:46

+0

雖然要小心如果一段時間可能發生在字符串的數字部分以外的任何地方(例如,在「2.11abc.def」或「a.b215」中) – 2015-03-02 21:35:09

+0

@ JoshO'Brien謝謝你指出這一點。我發現第一個場景(「2.11abc.def」)確實存在於我的數據中。必須另闢蹊徑。 :( – 2015-03-02 21:49:11

7

如果有更多的麻煩字符串,其中週期可以出現字符串的數字部分之外,你可能想使用這樣的事情。

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 

請注意,如果一個字符串包含多個號碼,strapply()將提取所有這些,並返回總體結果爲列表(而不是一個簡單的載體),每輸入字符串一個列表元素。

+0

或通過基地:'regmatches(x,regexpr(「(^ | \\ d +)\\。\\ d +」,x))'或類似的 – thelatemail 2015-03-02 22:33:14

+0

@thelatemail - 是的,事實上,這就是我通常使用,問題是在這裏,它會默默地放下字符串中的* no *數字,這可能會很麻煩。'strapply()''empty ='參數比我更簡潔地解決了這個問題可以用'regmatches(regexpr())' – 2015-03-02 22:39:46

+0

這是一個令人討厭的問題,我承認 – thelatemail 2015-03-02 22:48:11

1

對於使用簡單起見,我建議在看「qdapRegex」包,使用它可以這樣做:

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

這應該幫助。

a <- c("2.11abc","15.1cde",".562342rfg") 
substr(a, 1, regexpr("[a-zA-Z]", a)-1)