R:从字符串中提取特定数字

时间:2016-07-02 11:35:39

标签: r

我有一个矢量如下

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

这里我想在&#34; X&#34;之前提取第一个数字。对于每个元素。 如遇2&#34; X&#34;即&#34; 6X2X75CL&#34;应计算数字12(6乘以2)。

预期产出

6, 24, 12, 168

感谢您的帮助...

4 个答案:

答案 0 :(得分: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 :(得分:3)

这是一个使用基数R的方法:

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

strplit沿“X”分解向量。结果列表被馈送到sapplyhead(x, -1)对列表中每个向量的最后一个元素执行操作。操作是将元素转换为数字并将它们相乘。使用prod删除最终元素。

正如@ zheyuan-li评论所述,Reduce可填写sapply(dataList, function(x) prod(as.numeric(head(x, -1)))) [1] 6 24 12 168 并且可能会更快一些:

if (selfEsteem.containsIgnoreCase(searchString))
    ...

答案 2 :(得分: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 :(得分: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
}