我有一个矢量如下
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
感谢您的帮助...
答案 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”分解向量。结果列表被馈送到sapply
,head(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
}