首页 > 解决方案 > 根据模式匹配创建指标变量

问题描述

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

创建示例数据:

#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() 来处理结果。

标签: rpattern-matchingstringr

解决方案


你可以这样做...

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

对于没有任何显式循环的解决方案,您可以使用outerwith stringr::str_detect(它是矢量化的)...

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

推荐阅读