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

时间:2014-04-18 00:47:30

标签: r subset

我有数据框“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)))

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

1 个答案:

答案 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)

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