从文本向量中提取数字

时间:2017-09-29 21:25:11

标签: r regex string

如何从“文本”列中提取数字,以便您可以在下面创建“结果”列?

dat = data.frame (text = c("int[1]","int[2]","int[3]","int[11]","be[4]","be[30]"),
outcome = c(1,2,3,11,4,30))



     text outcome
1  int[1]       1
2  int[2]       2
3  int[3]       3
4 int[11]      11
5   be[4]       4
6  be[30]      30

3 个答案:

答案 0 :(得分:2)

我评论的解决方案是天真的解决方案:

as.integer(gsub("[^0-9]", "", dat$text))

(这实际上与Santosh的答案相同,后者使用\\D的字符类来表示“除了数字之外的任何内容”。)只要没有两组或更多组数字,它就可以正常工作。例如,"5a4"将返回54,而不是您所期望的。 ycw的答案稍好一些,因为它找到了第一个连续的数字组,所以它会返回5。不完善的。

D.sen的评论更有弹性,如果你确信这些数字总是在括号内,那么它就不会被领先或跟随数字分散注意力。

gsub("(^.+\\[)(\\d+)(\\]$)", "\\2", dat$text)

我可能会建议将第三个正则表达式组扩展为(\\].*$)",因为如果/右括号后面有字符,它仍然会匹配。再说一次,如果你确信这“永远不应该发生”,那么当这种模式失败时,你可能想知道(功能失败)。

所有这些都假定为正整数。您可以使用[0-9.]替换\\d并将[0-9.]替换为1111,因为我不知道包含小数的字符类。这两种方法都没有提供负数,取幂或其他任何方法;有很多正则表达式指南可以提供更强大的方法来捕获所有“非平凡的数字”。

答案 1 :(得分:1)

dat$outcome <- as.numeric(gsub("\\D", "", dat$text))
dat

     text  outcome
1  int[1]       1
2  int[2]       2
3  int[3]       3
4 int[11]      11
5   be[4]       4
6  be[30]      30

答案 2 :(得分:0)

一种选择是使用stringr

# Create example data frame
dat <- data.frame(text = c("int[1]","int[2]","int[3]","int[11]","be[4]","be[30]"))

library(stringr)
# Use str_extract
dat$outcome <- as.numeric(str_extract(dat$text, "[0-9]+"))
dat
     text outcome
1  int[1]       1
2  int[2]       2
3  int[3]       3
4 int[11]      11
5   be[4]       4
6  be[30]      30