R:用于提取混合馏分的正则表达式

问题描述 投票:0回答:1

我有一个数据框,其中一列包含一串数字,非常类似于此一

´´´ > 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 quantity 54 4 2 14 1/2 2 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。如果有人可以伸出援手,将不胜感激!

r regex gsub
1个回答
0
投票

以下内容有效(但需要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)
© www.soinside.com 2019 - 2024. All rights reserved.