我有一个问题,我试图从包含文本和数字的字符串中提取数字,然后创建两个新列,显示数字的最小值和最大值。
例如,我有一列和一串这样的数据:
Text
Section 12345.01 to section 12345.02
我想从 Text 列中的数据创建两个新列,如下所示:
Min Max
12345.01 12345.02
我将 dplyr 和 stringr 与正则表达式一起使用,但正则表达式仅提取模式的第一次出现(第一个数字)。
df%>%dplyr::mutate(SectionNum = stringr::str_extract(Text, "\\d+.\\d+"))
如果我尝试使用
stringr::str_extract_all
功能。它似乎提取了模式的两个出现,但它在小标题中创建了一个列表,我发现这是一个真正的麻烦。所以我坚持第一步,只是想把数字放到他们自己的列中。谁能推荐最有效的方法来做到这一点?理想情况下,我想从字符串中提取数字,将它们转换为数字
as.numeric
然后运行 min()
和 max()
职能。
最佳答案
与 extract
来自 tidyr
. extract
将每个正则表达式捕获组变成它自己的列。 convert = TRUE
方便,因为它将结果列强制为最佳格式。 remove = FALSE
如果我们想保留原始列,可以使用。最后 mutate
是可选的,以确保提取的第一个数字确实是最小值:
library(tidyr)
library(purrr)
df %>%
extract(Text, c("Min", "Max"), "([\\d.]+)[^\\d.]+([\\d.]+)", convert = TRUE) %>%
mutate(Min = pmap_dbl(., min),
Max = pmap_dbl(., max))
输出:
Min Max
1 12345.02 12345.03
数据:
df <- structure(list(Text = structure(1L, .Label = "Section 12345.03 to section 12345.02", class = "factor")), class = "data.frame", row.names = c(NA,
-1L), .Names = "Text")
关于r - 使用R中的stringr和regex从文本中提取数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52486211/