`data.table`基于'agrep'选择子集的方法?

`data.table`基于'agrep'选择子集的方法?,r,data.table,R,Data.table,我正在尝试从data.frame转换为data.table,需要一些关于我试图对单个列执行的一些逻辑索引的建议。这是我的一张桌子: places <- data.table(name=c('Brisbane', 'Sydney', 'Auckland', 'New Zealand', 'Australia'), search=c('Brisbane AU Australia',

我正在尝试从
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)
我有一个问题:

是否有更多的
数据表
-方法来执行此操作?在我看来,每次存储
点击次数
似乎都是一种
data.frame
方法

这需要注意,我最终希望使用
agrep
,而不是
grep
/
%like%

words <- c('AU', 'Bisbane') # note the mis-spelling
hits <- places
for (w in words) {
    hits <- hits[agrep(w, search)]
}

words您可以将
agrep
函数矢量化,以避免循环

请注意,
agrep2
的结果是一个列表,因此调用
unlist

words <- c("Bisbane", "NZ")
agrep2 <- Vectorize(agrep, vectorize.args = "pattern")
places[unlist(agrep2(words, search))]

##           name                  search
## 1:    Brisbane   Brisbane AU Australia
## 2:    Auckland Auckland NZ New Zealand
## 3: New Zealand          NZ New Zealand

wordsmathematic.coffee,正如我在评论中提到的,您不能通过将一列(或多列)设置为关键列来“部分匹配”。也就是说,在
data.table
places中,您已经将“search”列设置为键列。在这里,您可以通过使用
数据快速子集。表的
二进制搜索(与向量扫描子集相反),方法如下:

places["Brisbane AU Australia"] # binary search when "search" column is key'd
# is faster compared to:

places[search == "Brisbane AU Australia"] # vector scan
但在您的情况下,您需要:

places["AU"] 
为所有行指定一个键列中部分匹配“AU”。这是不可能的(当然这是一个非常有趣的特性)


如果您正在搜索的
子字符串本身不包含不匹配项,则可以尝试将搜索字符串拆分为单独的列。也就是说,如果将列
search
拆分为包含
Brisbane
AU
Australia
的三列,则可以将
data.table
的键设置为包含
AU
Brisbane
的列。然后,您可以查询您提到的方式:

# fast subset, AU and Brisbane are entries of the two key columns
places[J("AU", "Brisbane")]

不确定这是否是for循环的预期用途。你为什么要覆盖点击率?这不就是最后一个子集吗?我不认为有什么可以利用
数据的力量。表
从这个问题,至少据我所知。我确实想要循环,用解释更新问题。数学。咖啡,我明白你现在的意思了。但是,它们是两个键(用于两个不同的列)。您的问题是,子集设置操作取决于
agrep
。这意味着,您不能直接使用key column的值进行子集,这会呈现
数据。table
没有那么有用,iiuc(除非您可以使用key column条目的部分匹配进行子集,这至少到目前为止是不可能的)。如果这还不清楚,我会在早上写一个答案,更好地解释这个评论。啊,这对我来说很有意义。有时间写下来,我就接受。cheers+1在功能请求列表中。cheers(不幸的是,我的
搜索
列将有一个变量,理论上不限字数)。我将保留我当前的代码。
# fast subset, AU and Brisbane are entries of the two key columns
places[J("AU", "Brisbane")]