使用data.table,按组选择所有值为TRUE的行。

12
我有一些数据,其中包含一个分组变量“group”和一个逻辑变量“logic”。
library(data.table)
library(dplyr)

dt <- data.table(
    logic = c(TRUE, TRUE, FALSE, TRUE, TRUE, TRUE),
    group = c("A" , "A",  "A"  , "B" , "B" , "B")
)

我想筛选那些“logic”列中所有值为TRUE的组。

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

然而,我使用 data.table 尝试失败了,要么获取整个表格,要么没有获取到。

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

2
dplyr的解决方案与data.table的解决方案不相符。在dplyr中,您首先进行分组,然后进行过滤,在data.table中,您首先进行过滤,然后进行分组。 - jangorecki
@jangorecki,说得好。那么在 dt[all(.SD$logic), group,by = group].SD 是如何定义的呢? - Cron Merdek
我不理解你在上一条评论中的简短问题。你可能需要将其作为一个新的SO问题提出。 - jangorecki
@jangorecki,我对你提到的逻辑有些担忧。只有在by已经被评估时,.SD才会被定义。*.SD是一个数据表,它包含x数据集的每个组的子集,不包括任何用于by(或keyby)的列。 - Cron Merdek
2个回答

16

你可以使用[,例如

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

8

我们需要使用 if 语句。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接