%in%(' in'运算符)和|| ('或'运算符)一起用于分隔混合在一起的数据集

时间:2016-07-12 04:24:48

标签: r

我想通过进入期间将进入商店的客户分开:在 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) 

2 个答案:

答案 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