2017-06-02 27 views
0

我有一個包含兩組數字的字符串變量的數據框。我需要將一個數字乘以下一個數字並將結果分配給另一個字段。這對於正則表達式來說很簡單,但問題在於某些觀察值包含需要計算的多個輸入,並且我很難概念化如何遍歷這些字符串,直到沒有其他對需要乘法爲止。然後,一旦所有配對相乘,它們必須被添加並分配給新的變量。從具有可變輸入的字符串中算術

這裏是我的原始數據

V1 <- c("ABC01-3XYZ=2, ABC04-5XYZ=3, ABC06-7XYZ=1", 
     "ABC04-5XYZ=2", "ABC01-3XYZ=1, ABC04-5XYZ=1") 
df <- data.frame(V1) 

            V1 
1 ABC01-3XYZ=2, ABC04-5XYZ=3, ABC06-7XYZ=1 
2        ABC04-5XYZ=2 
3    ABC01-3XYZ=1, ABC04-5XYZ=1 

我想多緊跟整數「 - 」由整數緊隨「=」,再總結他們,所以最後的結果看起來像這樣:

         V1 V2 
1 ABC01-3XYZ=2, ABC04-5XYZ=3, ABC06-7XYZ=1 28 
2        ABC04-5XYZ=2 10 
3    ABC01-3XYZ=1, ABC04-5XYZ=1 8 

如何重複過去的每個逗號任何建議,將不勝感激。謝謝!

+0

用'分裂他們,' – Masoud

+0

你能擴大那?我實際上已經嘗試將它們分成多列,但這並不能幫助我應用所需的乘法和加法,因爲沒有定義數量的列來應用函數。 –

+0

我不是故意要列的。拆分它們並作爲列表存儲,並存儲每行中的多少記錄,等等等等等等。無論如何,拉米亞的答案比我提出的要聰明得多。 – Masoud

回答

1

你可以使用str_match_allstringr包,然後訪問要使用sapply部分:

library(stringr) 
l = lapply(df$V1,function(x) str_match_all(x,c("-(\\d+)","=(\\d+)"))) 
df$V2 = sapply(l,function(x) sum(as.numeric(x[[2]][,2])*as.numeric(x[[1]][,2]))) 

這將返回:

[1] 28 10 8 
+0

完美!謝謝。 –