R 复数字符串提取
我有一个数据框,其中包含一个订单列表,不幸的是,该订单将商品的成本连接到字符串中,例如R 复数字符串提取,r,tidyverse,R,Tidyverse,我有一个数据框,其中包含一个订单列表,不幸的是,该订单将商品的成本连接到字符串中,例如 1 First aid training for 226.80 GBP 我想知道如何从这样的列表中提取项目成本。在上面的例子中:226.80。我熟悉使用gsub和/或str_detect,但我不知道当数字字符串的长度改变长度时如何提取(例如,226.50的长度为5个字符,37654.90的长度为8个字符)。请注意,我需要删除上面字符串中的第一个数字(即“1”)。我只需要在字符串GBP之前保留数字 这里是一个
1 First aid training for 226.80 GBP
我想知道如何从这样的列表中提取项目成本。在上面的例子中:226.80。我熟悉使用gsub
和/或str_detect
,但我不知道当数字字符串的长度改变长度时如何提取(例如,226.50的长度为5个字符,37654.90的长度为8个字符)。请注意,我需要删除上面字符串中的第一个数字(即“1”)。我只需要在字符串GBP之前保留数字
这里是一个简短的数据框架,我希望它能涵盖所有情况,如果有人能帮助我编写适当的代码
df <- data.frame(id = c(1:5), item = c("1 First aid training for 226.80 GBP", "3 books for 2.80 GBP", "5 laptops for 2126.80 GBP", "145 sandwiches for 342.10 GBP", "1 car for 37654.90 GBP"))
df我们可以使用sub
提取“GBP”
之前的数字
您可能希望将其包装为.numeric
*?
意味着延迟捕获尽可能少的字符
我们正在尝试捕获信息(\\d+\.\\d+
,表示十进制数
\\s?GBP
表示一个可选的空格,后跟GBP
,因此在某些情况下,它也匹配226.80GBP
,不带空格
为了处理逗号,在不使正则表达式变得更复杂的情况下,我们可以使用
gsub
从字符串中完全删除逗号,因为我们需要的唯一信息是数字,所以如果替换了其他一些逗号也无所谓
sub(".*?(\\d+\\.\\d+)\\s?GBP", "\\1", gsub(",","",df$item))
我们可以使用
sub
提取“GBP”
之前的数字
您可能希望将其包装为.numeric
*?
意味着延迟捕获尽可能少的字符
我们正在尝试捕获信息(\\d+\.\\d+
,表示十进制数
\\s?GBP
表示一个可选的空格,后跟GBP
,因此在某些情况下,它也匹配226.80GBP
,不带空格
为了处理逗号,在不使正则表达式变得更复杂的情况下,我们可以使用
gsub
从字符串中完全删除逗号,因为我们需要的唯一信息是数字,所以如果替换了其他一些逗号也无所谓
sub(".*?(\\d+\\.\\d+)\\s?GBP", "\\1", gsub(",","",df$item))
看来情况总是一样的。如果是这种情况,那么您还可以使用拆分方法。这里有一个想法
sapply(strsplit(as.character(d5$item), ' '), function(i) tail(i, 2))[1,]
#[1] "226.80" "2.80" "2126.80" "342.10" "37654.90"
当然,您也可以从stringr
使用函数word
,只需执行以下操作
stringr::word(d5$item, -2)
#[1] "226.80" "2.80" "2126.80" "342.10" "37654.90"
看来情况总是一样的。如果是这种情况,那么您还可以使用拆分方法。这里有一个想法
sapply(strsplit(as.character(d5$item), ' '), function(i) tail(i, 2))[1,]
#[1] "226.80" "2.80" "2126.80" "342.10" "37654.90"
当然,您也可以从stringr
使用函数word
,只需执行以下操作
stringr::word(d5$item, -2)
#[1] "226.80" "2.80" "2126.80" "342.10" "37654.90"
太好了,谢谢你。如果不需要太多的努力,您是否能够提供一点关于上述代码行正在做什么的扩展信息?乍一看很难解析。@Simon补充了一些解释。非常感谢您的帮助,谢谢。当应用到实际数据时,我刚刚发现了一个边缘情况。一些长数字不是逗号分隔的(例如1654.80),而另一些可以有逗号(例如1654.80)。有没有办法处理大数字的逗号?太好了,谢谢。如果不需要太多的努力,您是否能够提供一点关于上述代码行正在做什么的扩展信息?乍一看很难解析。@Simon补充了一些解释。非常感谢您的帮助,谢谢。当应用到实际数据时,我刚刚发现了一个边缘情况。一些长数字不是逗号分隔的(例如1654.80),而另一些可以有逗号(例如1654.80)。有没有办法处理大数字的逗号?