提取不同的包组件[R]

时间:2018-01-25 12:18:57

标签: r

我想在包装中找到计量单位。 我在这里有一个字段如下。

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))

我很感激任何人帮助提取其他人。

提前致谢!!

1 个答案:

答案 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")