这里正确的运算符是%in%
。这是一个使用虚拟数据的示例:
set.seed(1)
dat <- data.frame(bf11 = sample(4, 10, replace = TRUE),
foo = runif(10))
提供:
> head(dat)
bf11 foo
1 2 0.2059746
2 2 0.1765568
3 3 0.6870228
4 4 0.3841037
5 1 0.7698414
6 4 0.4976992
使用%in%
操作符,选取dat
数据集中bf11
等于1,2,3
中任意一个的子集:
> subset(dat, subset = bf11 %in% c(1,2,3))
bf11 foo
1 2 0.2059746
2 2 0.1765568
3 3 0.6870228
5 1 0.7698414
8 3 0.9919061
9 3 0.3800352
10 1 0.7774452
至于为什么您原来的代码没有起作用,可以将其分解以查看问题所在。 查看 1 || 2 || 3
的求值结果:
> 1 || 2 || 3
[1] TRUE
如果你使用 |
替代使用 &&
,你将得到相同的结果。因此,subset()
函数仅会返回 bf11
为 TRUE
(或者等价于 TRUE
的值)的行。
你本可以这样写:
subset(dat, subset = bf11 == 1 | bf11 == 2 | bf11 == 3)
这与我早先使用的 subset()
函数调用得到了相同的结果。关键是您需要一系列单一的比较,而不是一系列选项之间的比较。但是如您所见,在这种情况下,%in%
更加有用且简洁。请注意,我必须使用 |
,因为我想逐个将 bf11
的每个元素与 1
、2
和 3
进行比较。比较:
> with(dat, bf11 == 1 || bf11 == 2)
[1] TRUE
> with(dat, bf11 == 1 | bf11 == 2)
[1] TRUE TRUE FALSE FALSE TRUE FALSE FALSE FALSE FALSE TRUE
||
表单从左到右进行操作,只检查向量中的第一个元素。在这些情况下,%in%
也是一个有用的运算符。搜索[r] %in%
可以很有启发性。 - Chase||
和|
是无用的:1||2||3
和1|2|3
都会被计算为 TRUE,因此子集只包括那些bf11
为 TRUE(或者计算结果为 TRUE 的情况)。在这里使用%in%
更加有帮助。 - Gavin Simpson%in%
是最好的选择。 - Henry