2013-03-05 68 views
0

如果5列(5-10)中的任何一列在我的列表中包含一个因子(keep.list),我想要创建两个子集我的数据以及其中没有任何列包含keep.list中的任何内容的列。这里就是我到目前为止,但不能让它的子集的权利:基于列表中是否包含一个多个变量来设置数据

test.cols <- c(5:10) 
keep.list <- c("dog","cat","mouse","bird") 

data.sub.IN <- data.big[which(any(keep.list %in% data.big[test.cols])),] 

data.sub.NOT.IN <- data.big[which(any(keep.list !%in% data.big[test.cols])),] 

我觉得which()any()可以帮助,但我可能是错的,我不知道如何处理“不包含”情况下,如通常的!命令不起作用。

+1

使用'any'时which'你不需要'或'%in%'构造一个索引。并不是说你有一个特别完整的例子。我会认为'任何'会将结果折叠成一个单一的值,这不是我所理解的你想要的值。 – 2013-03-05 03:17:57

回答

3

可以使用apply做到这一点:

keep <- apply(data.big[test.cols], 1, function(r) any(r %in% keep.list)) 
data.sub.IN <- data.big[keep, ] 
data.sub.NOT.IN <- data.big[!keep, ] 

apply适用的功能将数据帧的每一行。在这种情况下,对于每一行,它检查该行中的任何项目是否在keep.list中。

+0

像冠军一样工作。非常感激。 – km5041 2013-03-05 03:08:45

1

我会和@ DavidRobinsons的回答一起去的,但是如果你想保持它的形式,你需要移动!。要取消%in%,您需要在逻辑运算符的第一部分之前加上!

B <- 1:4 
A <- 3:6 
A %in% B 
[1] TRUE TRUE FALSE FALSE 
!A %in% B 
[1] FALSE FALSE TRUE TRUE 

因此,对于您的情况:

data.sub.NOT.IN <- data.big[which(any(!keep.list %in% data.big[test.cols])),] 

但同样,在这种情况下使用apply是一个更好的选择,我想。

编辑 基于@迪文的评论,这可能无法正常工作(硬说没有如数据集),你可能真的需要:

data.sub.NOT.IN <- data.big[which(!any(keep.list %in% data.big[test.cols])),] 
+0

没有在我构造的简单测试用例上返回正确的结果。我想如果避免使用'apply'可能会很好,但在这种情况下,我认为你被OP的缺乏理解所误导。 – 2013-03-05 03:33:55

相关问题