我想使用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。
答案 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]