R 仅当组中存在给定行时,datatable才会对组应用筛选器

R 仅当组中存在给定行时,datatable才会对组应用筛选器,r,if-statement,filter,datatable,nested,R,If Statement,Filter,Datatable,Nested,仅当存在某个值时,我才尝试对数据表中的组应用筛选器。如果不存在,则筛选器不适用,并且保留组中的所有行。近似 我正在寻找一个数据表版本的答案,如果可能的话,但与一些额外的标准 首先,我尝试了以下方法: test <- data.table(grp=c(1,1,1,10,10,10,12,12), c=c("a", "b", "c", "b", "c", "c","

仅当存在某个值时,我才尝试对
数据表中的组应用筛选器。如果不存在,则筛选器不适用,并且保留组中的所有行。近似

我正在寻找一个数据表版本的答案,如果可能的话,但与一些额外的标准

首先,我尝试了以下方法:

test <- data.table(grp=c(1,1,1,10,10,10,12,12), c=c("a", "b", "c", "b", "c", "c","a","b"))
test[test[, .I[c=="a" | all(c!="a")], by = grp]$V1]
对于grp=1,它存在于lst中,因此应用过滤器。 对于grp=10,不需要过滤器,因为没有一行带有c=“a” 对于grp=12,过滤器适用,但由于它不属于lst,因此不使用过滤器


谢谢

这里有一个使用帮助器列的解决方案:

> test <- data.table(grp=c(1,1,1,10,10,10,12,12), c=c("a", "b", "c", "b", "c", "c","a","b"))
> lst <- c(1, 8)
> dtFiltered <- test[, filtera := !all(c != "a") & (grp %in% lst), by = grp][!filtera | c == "a"][, filtera := NULL]

>test lst dtFiltered这里有一种使用相同逻辑的方法。除了OP的逻辑之外,添加
|
)条件以返回“lst”对象中未包含的所有组行

test[test[, all(c != 'a')| (c == 'a' & .BY %in% lst)|
          !.BY %in% lst, by = grp]$V1]
-输出

#  grp c
#1:   1 a
#2:  10 b
#3:  10 c
#4:  10 c
#5:  12 a
#6:  12 b

或者我们可以使用
if/else
条件

test[test[, .I[if(!.BY %in% lst) TRUE else
     (c=="a" & grp %in% lst) | all(c!="a")] , by = grp]$V1]

根据你的情况,为什么她要把12英镑的团费退还给你呢。您正在%lst中执行
grp%,而12Your
lst的情况并非如此。我又添加了一个条件以返回组未包含在列表中的情况,我只想将筛选器应用于grp=“1”,而不应用于grp=“12”,尽管它们都有c=“a”。我知道我错了。在我看来,它就像嵌套的if条件,但我不知道如何在这里应用它。请检查下面的代码。我寄了两箱。当列“grp”是一个
因子时,以及当它是一个
字符时,上述行为是否会有所不同?看起来它正在改变。谢谢@最好转换成
字符
cass
#  grp c
#1:   1 a
#2:  10 b
#3:  10 c
#4:  10 c
#5:  12 a
#6:  12 b
test[test[, .I[if(!.BY %in% lst) TRUE else
     (c=="a" & grp %in% lst) | all(c!="a")] , by = grp]$V1]