2016-07-02 24 views
1

的我有一個矢量如下R:提取特定數量出字符串

data <- c("6X75ML","24X37.5ML (KKK)", "6X2X75ML", "168X5CL (UUU)") 

在這裏,我想要的「X」爲每個元件之前提取所述第一數量。 在2「X」即「6X2X75CL」的情況下,應計算12(6乘以2)。

預期輸出

6, 24, 12, 168 

謝謝你的幫助...

回答

1

我們也可以使用str_extract_all

library(stringr) 
sapply(str_extract_all(data, "\\d+(?=X)"), function(x) prod(as.numeric(x))) 
#[1] 6 24 12 168 
3

下面是使用基礎R的方法:

dataList <- strsplit(data, split="X") 
sapply(dataList, function(x) Reduce("*", as.numeric(head(x, -1)))) 
[1] 6 24 12 168 

strplit突破了沿 「X」 的載體。生成的列表被提供給sapply,該列表對除列表中每個向量的最終元素之外的所有元素執行操作。操作是將元素轉換爲數字並將它們相乘。使用head(x, -1)刪除最後一個元素。

正如@宋哲元立意見,prod可以填寫爲Reduce並很可能會更快一點:

sapply(dataList, function(x) prod(as.numeric(head(x, -1)))) 
[1] 6 24 12 168 
+0

感謝所有.....這真是太神奇了....我一直在這一切都錯了....不知道你可以解決它在一個行..... – Ashwin

4

下面是使用正則表達式一個可能的解決方案:

data <- c("6X75ML","24X37.5ML (KKK)", "6X2X75ML", "168X5CL (UUU)") 

# this regular expression finds any group of digits followed 
# by a upper-case 'X' in each string and returns a list of the matches 
tokens <- regmatches(data,gregexpr('[[:digit:]]+(?=X)',data,perl=TRUE)) 

res <- sapply(tokens,function(x)prod(as.numeric(x))) 
> res 
[1] 6 24 12 168 
1
ind=regexpr("X",data) 
val=as.integer(substr(data, 1, ind-1)) 
data2=substring(data,ind+1) 
ind2=regexpr("[0-9]+X", data2) 
if (!all(ind2!=1)) { 
    val2 = as.integer(substr(data2[ind2==1], 1, attr(ind2,"match.length")[ind2==1]-1)) 
    val[ind2==1] = val[ind2==1] * val2 
}