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

时间:2011-04-26 17:54:00

标签: r statistics subset logical-operators operator-precedence

如果我想在R中选择数据子集,我可以使用子集函数。我想根据几个标准之一的数据进行分析,例如:某个变量是1,2或3。 我试过了

myNewDataFrame <- subset(bigfive, subset = (bigfive$bf11==(1||2||3)))

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

我使用

得到了正确的结果
 newDataFrame <- subset(bigfive, subset = (bigfive$bf11==c(1,2,3)))

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

2 个答案:

答案 0 :(得分:26)

正确的运算符是%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

dat的子集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

至于为什么你的原件不起作用,请将其分解以查看问题。查看1||2||3评估的内容:

> 1 || 2 || 3
[1] TRUE

您可以使用|来获得相同的内容。因此,subset()调用只会返回bf11TRUE的行(或评估为TRUE的内容)。

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

subset(dat, subset = bf11 == 1 | bf11 == 2 | bf11 == 3)

其结果与我之前的subset()调用相同。关键是你需要进行一系列单一比较,而不是一系列选项的比较。但正如您所看到的,%in%在这种情况下更有用,更简洁。另请注意,我必须使用|,因为我想依次将bf11的每个元素与123进行比较。比较:

> 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

答案 1 :(得分:5)

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

myNewDataFrame <- subset(bigfive, subset = bf11 == 1 | bf11 == 2 | bf11 == 3)

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

data(airquality)
dat <- subset(airquality, subset = (Temp > 80 & Month > 5) | Ozone < 40)

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

myNewDataFrame <- subset(bigfive, subset = bf11 %in% c(1, 2, 3))

正如Chase也指出的那样,请务必了解|||之间的区别。要查看运营商的帮助页面,请使用引用运营商的?'||'