的我有一個矢量如下R:提取特定數量出字符串
data <- c("6X75ML","24X37.5ML (KKK)", "6X2X75ML", "168X5CL (UUU)")
在這裏,我想要的「X」爲每個元件之前提取所述第一數量。 在2「X」即「6X2X75CL」的情況下,應計算12(6乘以2)。
預期輸出
6, 24, 12, 168
謝謝你的幫助...
的我有一個矢量如下R:提取特定數量出字符串
data <- c("6X75ML","24X37.5ML (KKK)", "6X2X75ML", "168X5CL (UUU)")
在這裏,我想要的「X」爲每個元件之前提取所述第一數量。 在2「X」即「6X2X75CL」的情況下,應計算12(6乘以2)。
預期輸出
6, 24, 12, 168
謝謝你的幫助...
我們也可以使用str_extract_all
library(stringr)
sapply(str_extract_all(data, "\\d+(?=X)"), function(x) prod(as.numeric(x)))
#[1] 6 24 12 168
下面是使用基礎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
下面是使用正則表達式一個可能的解決方案:
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
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
}
感謝所有.....這真是太神奇了....我一直在這一切都錯了....不知道你可以解決它在一個行..... – Ashwin