r - 根据模式匹配创建指标变量
问题描述
我有一个文本变量,我想创建指示变量来标识文本变量中的模式向量。对于每个模式,应该创建一个新的指标变量(最好使用与模式相同的变量名称。
创建示例数据:
#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() 来处理结果。
解决方案
你可以这样做...
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
对于没有任何显式循环的解决方案,您可以使用outer
with stringr::str_detect
(它是矢量化的)...
library(stringr)
mydata[, vecpat] <- outer(mydata$text, vecpat, str_detect) + 0L
推荐阅读
- android - 用于 Firebase 数据更新的 setValue() 导致更新对象中的其他字段在 childEventListener 中的 onChildAdded 中返回 null
- python - 在 Linux 中编写的 django 项目如何运行,我有 Windows 吗?
- javascript - 在 AJAX 返回的元素仍然可见时暂停 HTML5 音频
- google-cloud-platform - WinScp SFTP - 没有支持的身份验证方法可用谷歌云
- php - 条卡处理
- c - 将一个引脚配置为输入而另一个引脚配置为输出时 AVR 端口上的奇怪行为
- javascript - 使用 JS 在已填充的选择标签中选择一个选项
- cookies - 谷歌“同意”cookie - 它是什么?
- javascript - 从解析的 html 中获取文本值
- c++ - Firebase:架构 x86_64 的未定义符号(配置多个项目)