根据模式匹配创建指标变量

时间:2018-06-08 10:34:50

标签: r grep pattern-matching stringr

我有一个文本变量,我想创建指示文件变量中模式向量的指示符变量。 对于每个模式,应创建一个新的指标变量(最好使用与模式相同的变量名称。

创建示例数据:

#rm(list = ls())
mydata <- read.table(
  header = T, con <- textConnection
  ('
ID text
6 "aaa"
7 "bbb"
10 "ccc"
11 "a bbb"
29 "a bbb"
30 "bbb"
31 "ddd"
'), stringsAsFactors = FALSE, fill = TRUE, strip.white = TRUE)
close(con)

单一模式匹配

# a single pattern
mydata$a <- as.integer(grepl(pattern = "aaa", x = mydata$text))
mydata$a

然后创建一个模式向量:

# multiple patterns stored in a vector
vecpat <- c("aaa", "bbb", "ccc", "ddd", "eee")

现在我的问题是如何调整上面的代码来为多个模式进行模式匹配和变量创建。 新变量显示被添加到数据框中,标签为“aaa”,“bbb”,“ccc”,“ddd”,“eee”,值范围为0到1.

我尝试使用stringr包中的str_match_all执行此操作。但我不知道如何处理结果对象。 以下链接(https://rpubs.com/iPhuoc/stringr_manipulation)会查看此内容,但不提供比以下引用更多的信息: “如果你想提取超过第一个电话号码,例如最后一个字符串中的第二个电话号码,你可以使用str_match_all()。但是,就像str_split()一样,它会返回一个列表,每个输入字符串都有一个组件,而你'我需要使用lapply()来处理结果。“

2 个答案:

答案 0 :(得分:1)

你可以这样做......

for(i in vecpat){
  mydata[, i] <- as.integer(grepl(pattern = i, x = mydata$text))
}

mydata
  ID  text aaa bbb ccc ddd eee
1  6   aaa   1   0   0   0   0
2  7   bbb   0   1   0   0   0
3 10   ccc   0   0   1   0   0
4 11 a bbb   0   1   0   0   0
5 29 a bbb   0   1   0   0   0
6 30   bbb   0   1   0   0   0
7 31   ddd   0   0   0   1   0

对于没有任何显式循环的解决方案,您可以将outerstringr::str_detect一起使用(向量化)...

library(stringr)
mydata[, vecpat] <- outer(mydata$text, vecpat, str_detect) + 0L

答案 1 :(得分:0)

这与安德鲁基本上是一样的答案,但我还是张贴了它:

lapply(vecpat, function(x){
    mydata[x] <<- as.numeric(grepl(x, mydata$text))
})
ID  text aaa bbb ccc ddd eee
1  6   aaa   1   0   0   0   0
2  7   bbb   0   1   0   0   0
3 10   ccc   0   0   1   0   0
4 11 a bbb   0   1   0   0   0
5 29 a bbb   0   1   0   0   0
6 30   bbb   0   1   0   0   0
7 31   ddd   0   0   0   1   0

看到更新,我又试了几次。在我的环境中,这是最快的:

library(stringi)
cbind(mydata, sapply(vecpat, function(x) stri_detect_fixed(mydata$text, x) + 0L))