Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 基于模式匹配创建指标变量_R_Pattern Matching_Stringr - Fatal编程技术网

R 基于模式匹配创建指标变量

R 基于模式匹配创建指标变量,r,pattern-matching,stringr,R,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" '), stringsAsFac

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

创建示例数据:

#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)
#rm(list=ls())

mydata您可以这样做

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

这与Andrew的答案基本相同,但我还是发布了:

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

这就是您需要的:
sapply(vecpat,grepl,x=mydata$text)+0L
亲爱的Andrew谢谢。它就像一个符咒。出于好奇,这是一个循环,是否也有一个向量化版本?我不认为有一个简单的向量化函数可以做到这一点。这里的另一个解决方案更多的是一种“向量化”方法,尽管两者基本上做相同的事情。我倾向于使用显式循环而不是使用
我将它们的速度与proc.time进行了比较:在超过100万条记录和3种模式上,这两种模式都花费了大约35秒。你的模式快了一点。但是,我尝试了800种模式(是的)然后它在记忆中回响,另一个例子成功了though@mauricevergeer事实上,这让我想到了——见上面的修正案——我意识到毕竟有一个矢量化的函数——
外部
。可能更快。哇,快多了。当时间从28秒降到2秒时。谢谢!亲爱的AmatsuNet,谢谢!它工作得很好,就像pr一样对我的问题的口头答复。
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
library(stringr)
mydata[, vecpat] <- outer(mydata$text, vecpat, str_detect) + 0L
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))