我想在包装中找到计量单位。 我在这里有一个字段如下。
pack <- c("1X7CL ML", "2X3ML CLose","24X33cl Ltront","24X1LTR CLear", "192X5cl mlow")
我需要在这里提取3个组件: 1)包中的eaches数量。这是X之前的第一个数字 2)然后每个包中的音量。这是X之后的第二个数字 3)第三个是在卷号之后提到的UOM [重要的是只考虑第一个UOM事件,因为之后可能还有其他文本)
下面是3个标准UOM,只会出现,但可以是大写字母或小写字母。
UOM <- c("CL","ML","LTR")
我希望结果能给我3个载体:
1)每包中的数量:1 2 24 24 192 2)每包中的体积:7 3 33 1 5 3)每包中的UOM:CL ML CL LTR CL
如果获得第一个结果(即每个包中的数字),我有下面的代码可以正常工作:
as.numeric(gsub("(.*?)(X.*)", "\\1", pack))
我很感激任何人帮助提取其他人。
提前致谢!!
答案 0 :(得分:0)
'pack'显示我OP的例子不包括小数点。如果我们包括作为模式。我们匹配字符(.*
),直到'X'后跟一个或多个带小数的数字([0-9.]+
)和零或多个空格(\\s*
- 来说明有空格的情况),将非空白字符捕获为一组((\\S+)
),并在替换中使用捕获组的反向引用(\\1
)
sub(".*X[0-9.]+\\s*(\\S+).*", "\\1", pack)
#[1] "CL" "ML" "cl" "LTR" "cl" "LTR" "LTR" "LTR" "LTR" "CL"
和第二个问题。我们捕获数字(不确定是否需要捕获小数)
as.numeric(sub(".*X(\\d+).*", "\\1", pack))
# [1] 7 3 33 1 5 1 1 1 1 75
如果我们还需要小数
as.numeric(sub(".*X(\\d+[.]*\\d*).*", "\\1", pack))
#[1] 7.000 3.000 33.000 1.000 5.000 1.140 1.125 1.000 1.000 75.000
请注意,vector
或data.frame列可以只有一个class
。通过使用as.numeric
,所有元素都将转换为numeric
类。
pack <- c("1X7CL ML", "2X3ML CLose","24X33cl Ltront","24X1LTR CLear",
"192X5cl mlow", "12X1.14 LTR (LTO)", "12X1.125 LTR (DOK)",
"6X1LTR NRF (JRF)", "12X1LTR NRF (LTO)", "6X75CL (Jacobs) 2014")