25

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

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

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

我得到了正确的结果

 newDataFrame <- subset(bigfive, subset = (bigfive$bf11==c(1,2,3)))

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

4

2 回答 2

35

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

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

至于为什么您的原始文件不起作用,请分解以查看问题。查看1||2||3评估结果:

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

而你会得到相同的使用|。结果,该subset()调用将仅返回行 where bf11is TRUE(或评估为 的内容TRUE)。

你可以写的应该是这样的:

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

这给出了与我之前的电话相同的结果subset()。关键是你需要一系列单一的比较,而不是一系列选项的比较。但正如您所看到的,%in%在这种情况下,它更有用且更简洁。另请注意,我必须使用|as 我想依次比较bf11反对12和的每个元素。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
于 2011-04-26T18:18:50.337 回答
10

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

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

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

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

正如大通指出的那样,%in%在您的示例中会更有效:

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

正如 Chase 还指出的那样,请确保您了解 和 之间的|区别||。要查看运算符的帮助页面,请?'||'在引用运算符的位置使用 。

于 2011-04-26T18:17:58.153 回答