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()调用将只返回中行bf11是TRUE(或者一些评价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)
对于您的示例,我认为以下应该有效:
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)
大通还指出,确保你理解之间的差异|和||.要查看运营商的帮助页面,请使用?'||'引用运营商的位置.