在其他字符串之后获取字符串

Obtaining string after other string

我有一个 data.frame 类似于下面显示的。如何取字符串 hourshour 之前的 2 和 1 值求和?

输入

test <- data.frame(value = c('Stick 1 whole clove into center of each diamond. Roast ham 2 hours. Reduce oven temperature to 300F. Continue to roast ham until golden, about 1 hour.'))

预期输出

> 3

观察:可以在任何字符串部分找到数字。但是在 hourhours.

之前的每个

一个选项是使用正则表达式环视来提取 'hour' 和 str_extract_all 之前的数字,将其转换为 numeric 并获得 sum

library(stringr)
sum(as.numeric(str_extract_all(test$value, "\d+(?=\shour)")[[1]]))
#[1] 3

查找后跟 space 和 hour 的数字,但只捕获数字。对于每个这样的捕获,将其转换为数字,然后求和。请注意,只需要一个相对简单的正则表达式,并且如果 test 有多于一行,则它会被矢量化并继续工作,如下面的第二个示例所示。

library(gsubfn)

sapply(strapply(as.character(test$value), "(\d+) hour", as.numeric), sum)
## [1] 3

另一个测试:

test2 <- rbind(test, test)
sapply(strapply(as.character(test2$value), "(\d+) hour", as.numeric), sum)
## [1] 3 3