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))