如何从“文本”列中提取数字,以便您可以在下面创建“结果”列?
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
答案 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