2015-10-04 96 views
2

想知道是否有人可以幫我解決這個問題。下面有這個數據。在R中提取帶小數點和空格的數字

[1] "Compared with 3 months earlier . . . . . . . . 123 (100.0) 11 (8 .9 60 (48. 8) 48 (39.0) 4 (3.3) . . . . . . . . . . . . . ."  
[2] "Compared with 3 months earlier . . . . . . . . 124 (100.0) 18 (14. 5) 60 (48.4) 42 (33 .9) 4 (3. 2) . . . . . . . . . . . . . ." 
[3] "Compared with 3 months earlier . . . . . . . . 124 (100.0) 7 (5.6) 42 (33.9) 64 (51.6) 11 (8.9) . . . . . . . . . . . . . ." 

想提取上面是這樣

123 100.0 11 8.9 60 48.8 48 39.0 4 3.3 
124 100.0 18 14.5 60 48.4 42 33.9 4 3.2 
124 100.0 7 5.6 42 33.9 64 51.6 11 8.9 

有一些,哪些應該被視爲一個單獨的號碼小數之間的一些隨機的空間。我試圖使用str_extract_all(),但它沒有給我預期的結果。

+0

你用'str_extract_all()'嘗試了什麼,這個輸出實際來自哪裏?即它是否有'[1]','[2]','[3]'或者這只是R矢量的輸出?來自'dput(variablename)'的輸出優於來自'head','tail'或'print'的剪切/粘貼。 – hrbrmstr

+0

str_extract_all(mytext,「[0-9] +」)。想知道是否有快速修復。以上是R.的輸出。mytext是上面輸出的字符向量。 – qfd

+0

你是如何期待獲得小數? – hrbrmstr

回答

4

類似於@hrbrmstr的方法。以hrbrmstr的示例(mytext),我做了以下。 gsub()部分處理您的空間問題。 .(space)(space).在代碼中被替換爲.。然後,stri_extract_all()提取所有數字。在你的情況下,你有幾個月的數字,這是每個矢量中的第一個數字。 lapply(function(x){x[-1]})刪除每個向量中的第一個數字。

library(stringi) 
library(magrittr) 

gsub(pattern = "\\.\\s|\\s\\.", replacement = "\\.", x = mytext) %>% 
stri_extract_all(regex = "\\d+\\.\\d+|\\d+") %>% 
lapply(function(x){x[-1]}) 


#[[1]] 
#[1] "123" "100.0" "11" "8.9" "60" "48.8" "48" "39.0" "4"  "3.3" 

#[[2]] 
#[1] "124" "100.0" "18" "14.5" "60" "48.4" "42" "33.9" "4"  "3.2" 

#[[3]] 
#[1] "124" "100.0" "7"  "5.6" "42" "33.9" "64" "51.6" "11" "8.9" 
+0

@qfd樂意幫助你。 :) – jazzurro

5

一些戰術字符替換正則表達式提取之前是爲了我傾向於「思考」 stringi的矢量替代了stringr(即使stringr有量化的替代品的基本支持和實際使用stringi被窩裏):

library(stringi) 

mytext <- c("Compared with 3 months earlier . . . . . . . . 123 (100.0) 11 (8 .9 60 (48. 8) 48 (39.0) 4 (3.3) . . . . . . . . . . . . . .", 
      "Compared with 3 months earlier . . . . . . . . 124 (100.0) 18 (14. 5) 60 (48.4) 42 (33 .9) 4 (3. 2) . . . . . . . . . . . . . .", 
      "Compared with 3 months earlier . . . . . . . . 124 (100.0) 7 (5.6) 42 (33.9) 64 (51.6) 11 (8.9) . . . . . . . . . . . . . .") 

# vectorized cleanup 

cleaned_text <- stri_replace_all_regex(mytext, 
             c(" \\.", "\\. ([:digit:])", "Compared with [[:digit:]]+ "), 
             c("", "\\.\\1", ""), 
             FALSE) 

stri_extract_all_regex(cleaned_text, "[[:digit:]][[:digit:]\\.]*") 

## [[1]] 
## [1] "123" "100.0" "11" "89" "60" "48.1" "48" "39.0" "4"  "3.3" 
## 
## [[2]] 
## [1] "124" "100.0" "18" "14.1" "60" "48.4" "42" "339" "4"  "3.1" 
## 
## [[3]] 
## [1] "124" "100.0" "7"  "5.6" "42" "33.9" "64" "51.6" "11" "8.9" 

希望你可以做as.numeric()和任何其他重塑/轉換。

+0

非常感謝喲!優秀。精美的作品。 – qfd