在data.table中使用grep进行子集化-unpredicatble

And*_*eas 3 r data.table

为什么“ grep”在下面的data.table调用中引起问题。

set.seed(45)
dt <- data.table(
    col1 = sample(letters[1:2],10, replace=TRUE), 
    col2=sample(letters[1:5], 10, replace=TRUE),
    col3=runif(10,1,5))
Run Code Online (Sandbox Code Playgroud)

这样子集的工作原理是:

dt[col1=="b" & col2=="b",] # Works
    col1 col2     col3
1:    b    b    1.5166
Run Code Online (Sandbox Code Playgroud)

但这会引发警告并返回错误的数据(或没有警告和错误的数据)

dt[grep("b", col1) & col2=="b",] # does not
# with seed = 42
> Warning message: In grep("b", col1) & col2 == "b" :   longer object
> length is not a multiple of shorter object length
# with seed = 45
   col1 col2     col3
1:    b    b 1.516600
2:    a    b 3.342007
3:    a    b 1.865772
Run Code Online (Sandbox Code Playgroud)

我可以通过将子集绑在一起避免这种混乱:

dt[grep("b", col1),][col2=="b",]
Run Code Online (Sandbox Code Playgroud)

但这不是很优雅。

ps。我想问题不同于这里

akr*_*run 6

的输出grep是数字vector。它可以是length0到原始长度之间的任意值,vector具体取决于匹配的数量。但是,如果使用grepl,则返回vector值为logical,它将始终length与原始向量相同。如果没有匹配项,唯一的区别就是全部匹配FALSE。在这方面,以下代码应该可以正常工作。

dt[grepl("b", col1) & col2=="b"]
Run Code Online (Sandbox Code Playgroud)