我有一堆电子邮件主题行,我正在尝试提取是否存在一系列值。这就是我试图这样做的方法,但我没有得到我想要的结果:
library(stringi)
df1 <- data.frame(id = 1:5, string1 = NA)
df1$string1 <- c('15% off','25% off','35% off','45% off','55% off')
df1$pctOff10_20 <- stri_match_all_regex(df1$string1, '[10-20]%')
id string1 pctOff10_20
1 1 15% off NA
2 2 25% off NA
3 3 35% off NA
4 4 45% off NA
5 5 55% off NA
我想要这样的事情:
id string1 pctOff10_20
1 1 15% off 1
2 2 25% off 0
3 3 35% off 0
4 4 45% off 0
5 5 55% off 0
答案 0 :(得分:3)
这是要走的路,
df1$pctOff10_20 <- stri_count_regex(df1$string1, '^(1\\d|20)%')
<强>解释强>
^ the beginning of the string
( group and capture to \1:
1 '1'
\d digits (0-9)
| OR
20 '20'
) end of \1
% '%'
答案 1 :(得分:1)
1) strapply
可以通过组合正则表达式(pattern=
参数)和函数(FUN=
参数)来实现。下面我们使用函数的公式表示。或者,我们可以使用data.table(或许多其他包)中的betweeen
。这会将匹配提取到模式,将函数应用于它并返回结果,将其简化为向量(而不是列表):
library(gsubfn)
btwn <- function(x, a, b) as.numeric(a <= as.numeric(x) & as.numeric(x) <= b)
transform(df1, pctOff10_20 =
strapply(
X = string1,
pattern = "\\d+",
FUN = ~ btwn(x, 10, 20),
simplify = TRUE
)
)
2)使用上面定义的相同btwn
函数的基础解决方案是:
transform(df1, pctOff10_20 = btwn(gsub("\\D", "", string1), 10, 20))