用两个联接条件子集一个数据表

时间:2019-06-20 13:07:27

标签: r data.table conditional-statements subset

我想使用data.table从以下数据集中收集信息。

set.seed(1)
TDT <- data.table(nr= c(1:100),Group = c(rep("A",10),rep("B",10),rep("C",10),rep("D",10),rep("E",10),rep("F",10),rep("G",10),rep("H",10),rep("I",10),rep("J",10)),
                      id = c(rep(1,20),rep(2,20),rep(3,20),rep(4,20),rep(5,20)),
                      Time = rep(seq(as.Date("2010-01-03"), length=20, by="1 month") - 1,5),
                      norm = round(runif(100)/10,2),
                      y = sample(100,100),
                      x2 = round(rnorm(100,0.75,0.3),2),
                      x3 = round(rnorm(100,0.75,0.3),2),
                      x4 = round(rnorm(100,0.75,0.3),2),
                      x5 = round(rnorm(100,0.75,0.3),2))
vars <- c("B", "C", "D")

我想获取以下条件适用的行:

组为A&y> = 50,并且var(B,C或D)的任何值的y> = 50。

但是我无法正确理解语法。有什么想法可以实现这些双重条件吗?像

X <- TDT[(Group=="A" & y>=50)&(Group==vars & y>=50)]

编辑:我需要第二个条件适用于B或C或D。不是AND。

2 个答案:

答案 0 :(得分:1)

您非常亲密:

TDT[(Group == "A" & y >= 50) & (Group %in% vars & y >= 50), ]

虽然更好的罪孽是:

TDT[Group %in% c("A", vars) & y >= 50, ]

考虑到在两种情况下都必须保留条件y >= 50

编辑以解释

让我解释一下为什么您的代码不起作用:

我们打电话给(Group == "A" & y >= 50)条件1。条件1必须使Group与A相同,并且y大于或等于50。

条件2 (Group == vars & y >= 50)要求Group等于vars的值的全部,即向量c("B", "C", "D"),并且y大于或等于50。第一部分永远不会与您的示例匹配,这就是为什么我引入%in%来检查Group是否等于 any < / strong> vars中的值。

&的加入条件1和2都需要两者条件成立,并且Group同时等于A并说出{ {1}}。

您想检查B是否等于Group"A"组成的集合中的值的任何

有关更多详细信息,请参见vars

答案 1 :(得分:0)

%in%允许您匹配多个参数,例如

TDT[Group %in% vars & y>=50]