我想通过进入期间将进入商店的客户分开:在 t1 / t2 / t3之后输入(不同的时间)。以下数据是所有客户直到结束时间范围。
t1<-c(1:10) # at end of period t1,
t2<-c(1:7,12:15) #at the end of t2, id 1:7 from t1 stayed in the store and the rest of peopel from t1 left. but new customers with id 12:15 entered
t3<-c(3:9,12:14,20:25) # at end of t3, some in t1 stay and some in t2 stay and new people came.
enter1<-t1
enter2<-t2[!(t2 %in% t1)]
enter3<-t3[!(t3%in%t1||t3%in% t2)]
enter3代码仅提供
的结果enter3[!(t3%in%t1)
答案 0 :(得分:3)
也许这有帮助
t3[!t3 %in% union(t1, t2)]
或使用|
代替||
t3[!(t3%in%t1|t3%in% t2)]
根据?"||"
|和||表示逻辑OR。较短的形式执行元素 比较与算术运算符大致相同。时间越久 表单从左到右进行评估,仅检查每个元素的第一个元素 向量。评估仅在确定结果之前进行。该 较长的形式适用于编程控制流程,通常 if条款中的首选。
如果我们检查输出
t3%in%t1|t3%in% t2
#[1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE FALSE FALSE FALSE FALSE FALSE FALSE
t3%in%t1||t3%in% t2
#[1] TRUE
只返回一个TRUE元素。所以,否定(!
)它会返回FALSE
!(t3%in%t1||t3%in% t2)
#[1] FALSE
如果我们使用它来对矢量进行子集化,我们将得到
t3[!(t3%in%t1||t3%in% t2)]
#integer(0)
答案 1 :(得分:2)
你也可以使用setdiff
来避免有点尴尬的x[!x %in% y]
构造:
enter3 <- t3[!((t3 %in%t1) | (t3%in% t2))] # using akrun's recommendation
e2 = setdiff(t2, t1)
e3 = setdiff(t3, union(t1, t2))
identical(enter2, e2)
# [1] TRUE
identical(enter3, e3)
# [1] TRUE