我有一个变量a,它包含如下字符:
DEVICE PRF .75MG 0.5ML
DEVICE PRF 1.5MG 0.5MLX4
CAP 12-25MG 30
CAP DR 60MG 100UD 3270-33 (32%)
我想将它们分为三个部分(或变量):
x y z
DEVICE PRF .75MG 0.5ML
DEVICE PRF 1.5MG 0.5MLX4
CAP 12-25MG 30
CAP DR 60MG 100UD 3270-33 (32%)
第一部分是描述,第二部分是强度,第三部分是体积。 我想我可以使用gregexpr(),但不确定如何实现它。 任何建议表示赞赏。谢谢!
答案 0 :(得分:1)
您可以使用
library(stringr)
str_match(x, "(.*)[ ]{1,}(.*(MG|ML))[ ]{1,}(.*)")[, -c(1, 4)]
# [,1] [,2] [,3]
# [1,] "DEVICE PRF" ".75MG" "0.5ML"
# [2,] "DEVICE PRF" "1.5MG" "0.5MLX4"
# [3,] "CAP" "12-25MG" "30"
# [4,] "CAP DR" "60MG" "100UD 3270-33 (32%)"
假设第二/中间部分始终以MG或ML结尾,并且没有空格。
模式(.*)[ ]{1,}(.*(MG|ML))[ ]{1,}(.*)
可以理解为:匹配的第一部分包含任何内容+至少一个空格+第二部分匹配以MG或ML结尾的末尾+至少一个空格+包含匹配的第三部分任何东西。
答案 1 :(得分:0)
使用中间部分没有空格且始终以.
或数字开头的假设,我们可以在基数R中执行以下操作:
a <- c("DEVICE PRF .75MG 0.5ML", "DEVICE PRF 1.5MG 0.5MLX4",
"CAP 12-25MG 30", "CAP DR 60MG 100UD 3270-33 (32%)")
a_as_csv <- sub('([^.0-9]*) ([.0-9][^ ]+) (.*)', '\\1,\\2,\\3', a)
read.csv(textConnection(a_as_csv), col.names = c('x', 'y', 'z'), header = F)
# x y z
# 1 DEVICE PRF .75MG 0.5ML
# 2 DEVICE PRF 1.5MG 0.5MLX4
# 3 CAP 12-25MG 30
# 4 CAP DR 60MG 100UD 3270-33 (32%)