2012-10-04 32 views
10

所有的數字讓我們想象一下,你有一個字符串:摘自一個字符串中的R

strLine <- "The transactions (on your account) were as follows: 0 3,000 (500) 0 2.25 (1,200)" 

是否有剔除數字到生產下列要求的解決方案的陣列/向量函數:

result <- c(0, 3000, -500, 0, 2.25, -1200)? 

result[3] = -500 

通知,則數字以會計表格,以便負數APPE呈現()之間。另外,您可以假定只有數字出現在數字第一次出現的右側。我對正則表達式並不擅長,所以如果你需要幫助的話可以提供幫助。另外,我不想假設字符串總是相同的,所以我正在尋找在第一個數字的位置之前去掉所有單詞(以及任何特殊字符)。

回答

24
library(stringr) 
x <- str_extract_all(strLine,"\\(?[0-9,.]+\\)?")[[1]] 
> x 
[1] "0"  "3,000" "(500)" "0"  "2.25" "(1,200)" 

更改括號來否定:

x <- gsub("\\((.+)\\)","-\\1",x) 
x 
[1] "0"  "3,000" "-500" "0"  "2.25" "-1,200" 

然後as.numeric()taRifx::destring完成了(在next versiondestring將默認支持底片所以keep選項不會是必要的):

library(taRifx) 
destring(x, keep="0-9.-") 
[1] 0 3000 -500 0 2.25 -1200 

OR:

as.numeric(gsub(",","",x)) 
[1]  0 3000 -500  0  2.25 -1200 
+0

嘿,你錯過了你的第一個正則表達式的一段時間。結果應該有2.25,而不是2和25. –

+0

@mplourde哎呀!感謝您指出了這一點。 –

+0

這很可怕。你的正則表達式就像我想要的一樣。我嘗試了,5正則表達式,並沒有帶來獨立於小數點(。,,)的值,你的做法。謝謝! –

17

這裏的基礎R方式,完整起見...

x <- unlist(regmatches(strLine, gregexpr('\\(?[0-9,.]+', strLine))) 
x <- as.numeric(gsub('\\(', '-', gsub(',', '', x))) 
[1]  0.00 3000.00 -500.00  0.00  2.25 -1200.00 
+0

謝謝。這兩個答案都是簡潔的,我在找什麼。 – Bertie

+0

如果知道所有數字都大於0,則從第一行中刪除點和第二個逗號,例如,當列名稱的編號如「col.1 col.2 col.3」中所示時。 –

+0

如果我想以其他方式擁有它,該怎麼辦。我有一個負數值的數據框,我想用()替換它們。請幫助 –

0

什麼,我在data frame(每排在同一列一個字符串)單字符串時是非常完美以下內容:

library(taRifx) 
DataFrame$Numbers<-as.character(destring(DataFrame$Strings, keep="0-9.-")) 

結果出現在同一個data frame的新列中。