2014-04-18 39 views
2

我有数据框“a”,它有一个名为“VAL”的变量。我想算其中val的值是23或24子集化数据帧中意外输出的原因 - R

我用它好工作两个代码元素:

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

你应该提供一些样本数据。 – CCurtis

+0

Thelatmail打败了我,但我想指出,你不需要使用'subset',而是'nrow(a [a $ VAL == 23 | a $ VAL == 24])''。有些人更喜欢“子集”,但我一直喜欢这样做。 – CCurtis

+1

@CCurtis,你的建议是同样低效的:没有必要创建一个完整的子数据。然后计算行数。相反,只需使用vector:'sum($%%in%c(23,24),na.rm = TRUE)'。 – flodel

回答

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) 

...你会得到两个返回的行(这使得由纯粹的运气预期的结果,但它是不恰当的使用)。