【发布时间】:2016-02-15 09:52:10
【问题描述】:
我有一个存储为 data.table DT 的数据集,如下所示:
print(DT)
category industry
1: administration admin
2: nurse practitioner truck
3: trucking truck
4: administration admin
5: warehousing nurse
6: warehousing admin
7: trucking truck
8: nurse practitioner nurse
9: nurse practitioner truck
我想将表格缩减为只有行业与类别匹配的行。我的一般方法是使用grepl() 正则表达式匹配字符串'^{{INDUSTRY}}[a-z ]+$' 和DT$category 的每一行,使用infuse() 在正则表达式字符串中插入DT$industry 的每一对应行来代替{{INDUSTRY}}。我很难找到一个流畅的 data.table 解决方案,它可以正确地循环遍历表并进行行内比较,所以我求助于 for 循环来完成工作:
template <- "^{{IND}}[a-z ]+$"
DT[,match := FALSE,]
for (i in seq(1,length(DT$category))) {
ind <- DT[i]$industry
categ <- d.daily[i]$category
if (grepl(infuse(IND=ind,template),categ)){
DT[i]$match <- TRUE
}
}
DT<- DT[match==TRUE]
print(DT)
category industry
1: administration admin
2: trucking truck
3: administration admin
4: trucking truck
5: nurse practitioner nurse
但是,我相信这可以以更好的方式完成。关于如何通过使用 data.table 包的功能来实现此结果的任何建议?据我了解,在这种情况下,使用包的方法可能比 for 循环更有效。
【问题讨论】:
-
您的真实用例的参数尚不清楚,但我想
by=industry或by=.(industry, category)可能会有所帮助(在以下任一答案中),减少所需的比较次数。 -
@Frank 所说的-按行业定期执行
grep-我很确定这会比stringr答案快得多(并且显然比子字符串更通用) -dt[dt[, grepl(industry, category), by = industry]$V1] -
@eddi
by=可能会重新排序数据,导致逻辑子集错误,可能是DT[ DT[, .I[grep(industry, category)], by = industry]$V1 ]来自 stackoverflow.com/a/16574176/1191259 -
你说得对
标签: regex r data.table data-cleaning