如果我想在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)))
但我希望能够通过逻辑运算符选择数据,所以:为什么第一种方法不起作用?
答案 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()
调用只会返回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
答案 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也指出的那样,请务必了解|
和||
之间的区别。要查看运营商的帮助页面,请使用引用运营商的?'||'
。