根据列表中是否包含一个多变量来设置数据

时间:2013-03-05 02:46:09

标签: r subset

如果5列(5-10)中的任何一列包含我的列表中的一个因子(keep.list),并且没有任何cols包含来自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()可能有所帮助,但我可能错了,我不知道如何处理“未包含”的情况,因为通常的!命令不是工作。

2 个答案:

答案 0 :(得分: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中。

答案 1 :(得分: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是一个更好的选择,我认为。

修改的 基于@Ddin的评论,这可能不起作用(没有示例数据集很难说),您可能实际需要:

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