使用`by`过滤data.table中的行

Cro*_*dek 6 r data.table

我想按照以下标准筛选组.将DT带来意想不到的效果.

输入数据

library(data.table)
library(dplyr)

dt <- data.table(
    logic = c(TRUE, TRUE, FALSE, TRUE, TRUE, TRUE),
    group = c("A" , "A",  "A"  , "B" , "B" , "B")
)
Run Code Online (Sandbox Code Playgroud)

我想过滤logic字段值的组all TRUE.

预期行为(由dplyr)

正如您所看到的dplyr那样,按预期工作,并且只返回值group = B

dt %>% 
  group_by(group) %>% 
  filter(all(logic))
# Source: local data table [3 x 2]
# Groups: group

#   logic group
# 1  TRUE     B
# 2  TRUE     B
# 3  TRUE     B
Run Code Online (Sandbox Code Playgroud)

出乎意料的行为 data.table

DT 并不真正过滤行,无论是带来所有表还是没有.

dt[all(logic), group, by = group]
# Empty data.table (0 rows) of 2 cols: group,group

dt[all(.SD$logic), group,by = group]
#    group group
# 1:     A     A
# 2:     B     B
Run Code Online (Sandbox Code Playgroud)

tal*_*lat 7

你可以[像使用一样

dt[, .SD[all(logic)], by = group]
#   group logic
#1:     B  TRUE
#2:     B  TRUE
#3:     B  TRUE
Run Code Online (Sandbox Code Playgroud)


akr*_*run 6

我们需要使用 if

dt[, if(all(logic)) .SD, by = group]
#    group logic
#1:     B  TRUE
#2:     B  TRUE
#3:     B  TRUE
Run Code Online (Sandbox Code Playgroud)