在子集函数和逻辑运算符中使用多个条件

Jan*_*anD 18 r subset operator-precedence logical-operators

如果我想在R中选择数据子集,我可以使用子集函数.我想基于与少数几个标准匹配的数据进行分析,例如,某个变量是1,2或3.我尝试过

myNewDataFrame <- subset(bigfive, subset = (bigfive$bf11==(1||2||3)))
Run Code Online (Sandbox Code Playgroud)

它总是只选择与第一个标准匹配的值,这里1.我的假设是它将从1开始,如果它的评估为"false",它将继续到2而不是3,如果没有匹配==之后的语句为"false",如果其中一个匹配,则为"true".

我得到了正确的结果

 newDataFrame <- subset(bigfive, subset = (bigfive$bf11==c(1,2,3)))
Run Code Online (Sandbox Code Playgroud)

但我希望能够通过逻辑运算符选择数据,所以:为什么第一种方法不起作用?

Rei*_*son 29

正确的运营商在%in%这里.以下是虚拟数据的示例:

set.seed(1)
dat <- data.frame(bf11 = sample(4, 10, replace = TRUE),
                  foo = runif(10))
Run Code Online (Sandbox Code Playgroud)

赠送:

> 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
Run Code Online (Sandbox Code Playgroud)

datwhere 的子集bf11等于任何集合1,2,3,使用如下%in%:

> 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
Run Code Online (Sandbox Code Playgroud)

至于为什么你的原件不起作用,打破它看看问题.看看1||2||3评估的内容是:

> 1 || 2 || 3
[1] TRUE
Run Code Online (Sandbox Code Playgroud)

而你会得到相同的使用|.作为一个结果,subset()调用将只返回中行bf11TRUE(或者一些评价TRUE).

你能写的东西会是这样的:

subset(dat, subset = bf11 == 1 | bf11 == 2 | bf11 == 3)
Run Code Online (Sandbox Code Playgroud)

这给出了与我之前的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
Run Code Online (Sandbox Code Playgroud)

  • @kostia引用运算符:类似`?"%in%"` (3认同)

jth*_*zel 6

对于您的示例,我认为以下应该有效:

myNewDataFrame <- subset(bigfive, subset = bf11 == 1 | bf11 == 2 | bf11 == 3)
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅示例?subset.只是为了演示,一个更复杂的逻辑子集将是:

data(airquality)
dat <- subset(airquality, subset = (Temp > 80 & Month > 5) | Ozone < 40)
Run Code Online (Sandbox Code Playgroud)

正如Chase所指出的那样,%in%在你的例子中会更有效率:

myNewDataFrame <- subset(bigfive, subset = bf11 %in% c(1, 2, 3))
Run Code Online (Sandbox Code Playgroud)

大通还指出,确保你理解之间的差异|||.要查看运营商的帮助页面,请使用?'||'引用运营商的位置.