R:用于提取带分数的正则表达式

R: Regex for extracting mixed fractions

我有一个数据框,其中一列包含一串数字,很像这个

´´´> df id full_quant 54 4 2 14 1/2 55 4 4 6 56 4 1/2 57 4 3 58 4 1 59 4 1 1/2

我想用单个数字创建一个新列 $quantity,例如1或10,或分数,或带分数。特别是使用字符串的第一个匹配模式——出于这个原因,我选择使用 sub 而不是 gsub

这是我用过的代码

df$quantity <- sub("(^[1-9]*\b.[\d\\d]?)", " \1", df$full_quant)

但我最终得到了第一列的副本

> df
   id full_quant   quantity
54  4  2 14 1/2   2 14 1/2 
55  4       4 6        4 6 
56  4       1/2        1/2 
57  4         3          3 
58  4         1          1 
59  4      1 1/2      1 1/2

我想得到的是:

> df id full_quant 数量 54 4 2 14 1/2 2<br> 55 4 4 6 4 56 4 1/2 1/2 57 4 3 3 58 4 1 1 59 4 1 1/2 1 1/2

我使用 RStudio。如果有人能伸出援手,将不胜感激!!

以下有效(但需要 stringr):

df <- data.frame(id = rep(4, 6), 
                 full_quant = c("2 14 1/2", "4 6", "1/2", "3", "1", "1 1/2"))

df$quantity <- stringr::str_extract(df$full_quant, "^([1-9]*(\s?\d*\/\d)?)")

df

#   id full_quant quantity
# 1  4   2 14 1/2        2
# 2  4        4 6        4
# 3  4        1/2      1/2
# 4  4          3        3
# 5  4          1        1
# 6  4      1 1/2    1 1/2

这是基础 R 版本:

df$quantity <- regmatches(df$full_quant, regexpr("^([1-9]*(\s?\d*\/\d)?)",df$full_quant))

或使用sub:

df$quantity <- sub("^([1-9]*(\s?\d*\/\d)?).*", "\1", df$full_quant)