【问题标题】:Subsetting Data based on whether one multiple variables are/aren't included in list基于一个多个变量是否包含在列表中的子集数据
【发布时间】:2013-03-05 02:46:09
【问题描述】:

如果 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() 可以提供帮助,但我可能错了,而且我不知道如何处理“不包含”的情况,因为通常的! 命令不起作用。

【问题讨论】:

  • 使用any%in% 构造索引时不需要which。并不是说你有一个特别完整的例子。我认为any 会将结果折叠为一个值,这不是我理解的你想要的。

标签: r subset


【解决方案1】:

您可以使用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 中。

【讨论】:

  • 像冠军一样工作。非常感谢。
【解决方案2】:

我会选择@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 是一个更好的选择。

编辑 根据@DWin 的评论,这可能行不通(如果没有示例数据集很难判断),您可能实际上需要:

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

【讨论】:

  • 在我构建的简单测试用例中没有返回正确的结果。我想如果可以避免 apply 会很好,但在这种情况下,我认为你被误导了OP缺乏理解。
猜你喜欢
  • 2016-03-29
  • 1970-01-01
  • 1970-01-01
  • 2019-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-23
相关资源
最近更新 更多