如果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()
可能有所帮助,但我可能错了,我不知道如何处理“未包含”的情况,因为通常的!
命令不是工作。
答案 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])),]