我有数据框“a”,它有一个名为“VAL”的变量。我想计算VAL值为23或24的元素。
我使用了两个有效的代码:
nrow(subset(a,VAL==23|VAL==24)
nrow(subset(a,VAL %in% c(23,24)))
但是,我尝试了其他代码,它会产生意想不到的输出,我不知道为什么。
nrow(subset(a,VAL ==c(23,24)))
即使我改变了23和24的顺序,它也会产生不同的意外输出。
nrow(subset(a,VAL ==c(24,23)))
为什么这些代码不正确?他们到底在做什么?
答案 0 :(得分:5)
通过一个例子可以看出它出错的地方:
a <- data.frame(VAL=c(1,1,1,23,24))
a
# VAL
#1 1
#2 1
#3 1
#4 23
#5 24
这些工作:
a$VAL %in% c(23,24)
#[1] FALSE FALSE FALSE TRUE TRUE
a$VAL==23 | a$VAL==24
#[1] FALSE FALSE FALSE TRUE TRUE
以下在比较时因向量回收而无效 - 请注意以下警告信息:
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
这最后一段代码会回收您正在测试的内容,基本上是在比较:
c( 1, 1, 1, 23, 24) #to
c(23, 24, 23, 24, 23)
...所以你不会返回任何行。更改订单将为您提供
c( 1, 1, 1, 23, 24) #to
c(24, 23, 24, 23, 24)
...并且你会得到两行(通过纯粹的运气给出了预期的结果,但它不适合使用)。