Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 复数字符串提取_R_Tidyverse - Fatal编程技术网

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)。有没有办法处理大数字的逗号?