我正在尝试从 to 转换data.frame
,data.table
并且需要一些关于我尝试在单个列上执行的逻辑索引的建议。这是我的一张桌子:
places <- data.table(name=c('Brisbane', 'Sydney', 'Auckland',
'New Zealand', 'Australia'),
search=c('Brisbane AU Australia',
'Sydney AU Australia',
'Auckland NZ New Zealand',
'NZ New Zealand',
'AU Australia'))
# name search
# 1: Brisbane Brisbane AU Australia
# 2: Sydney Sydney AU Australia
# 3: Auckland Auckland NZ New Zealand
# 4: New Zealand NZ New Zealand
# 5: Australia AU Australia
setkey(places, search)
我想提取其search
列与列表中所有单词匹配的行,如下所示:
words <- c('AU', 'Brisbane')
hits <- places
for (w in words) {
hits <- hits[search %like% w]
}
# I end up with the 'Brisbane AU Australia' row.
我有一个问题:
有没有更多data.table
的方法来做到这一点?在我看来,hits
每次存储似乎都是一种data.frame
方法。
这取决于我最终要使用的警告,agrep
而不是grep
/ %like%
:
words <- c('AU', 'Bisbane') # note the mis-spelling
hits <- places
for (w in words) {
hits <- hits[agrep(w, search)]
}
我觉得这并没有完全利用data.table
's 的功能,并且希望能想到如何修改代码。
编辑
我想要 for 循环,因为places
它非常大,我只想找到与所有单词匹配的行。因此,我只需要在结果中搜索下一个单词的最后一个单词(即依次细化结果)。
在data.table
介绍中谈到“二进制扫描”与“矢量扫描”(即“坏方法”是DT[DT$x == "R" & DT$y == "h"]
,“好方法”是setkey(DT, x, y); DT[J("R", "h")]
我只是想知道是否有某种方法可以在这里应用这种方法。