子集化数据帧中意外输出的原因 - R.

Cre*_*tat 2 r subset

我有数据框"a",它有一个名为"VAL"的变量.我想计算VAL值为23或24的元素.

我使用了两个有效的代码:

nrow(subset(a,VAL==23|VAL==24) 
nrow(subset(a,VAL %in% c(23,24)))
Run Code Online (Sandbox Code Playgroud)

但是,我尝试了其他代码,它提供了意想不到的输出,我不知道为什么.

nrow(subset(a,VAL ==c(23,24)))
Run Code Online (Sandbox Code Playgroud)

即使我改变了23和24的顺序,它也会产生不同的意外输出.

nrow(subset(a,VAL ==c(24,23)))
Run Code Online (Sandbox Code Playgroud)

为什么这些代码不正确?他们到底在做什么?

the*_*ail 5

通过一个示例来说明它出错的地方:

a <- data.frame(VAL=c(1,1,1,23,24))
a
#  VAL
#1   1
#2   1
#3   1
#4  23
#5  24
Run Code Online (Sandbox Code Playgroud)

这些工作:

a$VAL %in% c(23,24)
#[1] FALSE FALSE FALSE  TRUE  TRUE
a$VAL==23 | a$VAL==24
#[1] FALSE FALSE FALSE  TRUE  TRUE
Run Code Online (Sandbox Code Playgroud)

在比较时,由于矢量回收,以下情况不起作用 - 请注意以下警告消息:

a$VAL ==c(23,24)
#[1] FALSE FALSE FALSE FALSE FALSE
#Warning message:
#In a$VAL == c(23, 24) :
#  longer object length is not a multiple of shorter object length
Run Code Online (Sandbox Code Playgroud)

最后一段代码回收了您正在测试的内容并且基本上是比较:

c( 1,  1,  1, 23, 24) #to
c(23, 24, 23, 24, 23)
Run Code Online (Sandbox Code Playgroud)

...所以你没有得到任何返回的行.改变订单会给你

c( 1,  1,  1, 23, 24) #to
c(24, 23, 24, 23, 24)
Run Code Online (Sandbox Code Playgroud)

...并且你会得到两行返回(通过纯粹的运气给出了预期的结果,但它不适合使用).