为什么“ 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。我想问题不同于这里
的输出grep是数字vector。它可以是length0到原始长度之间的任意值,vector具体取决于匹配的数量。但是,如果使用grepl,则返回vector值为logical,它将始终length与原始向量相同。如果没有匹配项,唯一的区别就是全部匹配FALSE。在这方面,以下代码应该可以正常工作。
dt[grepl("b", col1) & col2=="b"]
Run Code Online (Sandbox Code Playgroud)