为什么子集只返回奇数行?

时间:2014-02-08 02:15:01

标签: r subset

我尝试使用以下代码对虹膜数据进行子集化

datanew = subset(iris, Species == c("setosa", "virginica"), select = -Species)

但我得到的结果只有1,3,5,7 ......行。为什么我最终得到奇怪的行?

3 个答案:

答案 0 :(得分:6)

简短回答:因为矢量回收,http://cran.r-project.org/doc/manuals/R-intro.html#Vector-arithmetic

答案很长:当您对表单x == y进行比较时,如果向量xy不具有相同的长度,则会将短文本重新匹配以匹配长长的。

例如,

> x <- c(1, 1, 1, 2, 2, 2)
> y <- c(1, 2)
> x == y
[1]  TRUE FALSE  TRUE  TRUE FALSE  TRUE

你基本上得到了比较结果c(1, 1, 1, 2, 2, 2) == c(1, 2, 1, 2, 1, 2) - 注意第二个更短的矢量被回收。

subset在内部使用矢量比较,因此回收规则也适用于此。

要获得您想要的内容,您必须将==替换为%in%,正如@Vincent在另一个帖子中指出的那样。

答案 1 :(得分:3)

我想你想要:

subset(iris, Species %in% c("setosa", "virginica"), select = -Species)

答案 2 :(得分:2)

它不仅会返回奇数行!

tail(subset(iris, Species == c("setosa", "virginica"), select = -Species))

##     Sepal.Length Sepal.Width Petal.Length Petal.Width
## 140          6.9         3.1          5.4         2.1
## 142          6.9         3.1          5.1         2.3
## 144          6.8         3.2          5.9         2.3
## 146          6.7         3.0          5.2         2.3
## 148          6.5         3.0          5.2         2.0
## 150          5.9         3.0          5.1         1.8

这是由于R的回收。查看iris$Species == c("setosa", "virginica")的输出。它在测试Species == "setosa"Species == "virginica"之间关闭。由于数据R c("setosa", "virginica")中的偶数行偶然没有剩余,R假定您想要回收。

如果我们添加另一行,我们会收到一条警告消息

iris <- rbind(iris, tail(iris, 1))

foo <- subset(iris, Species == c("setosa", "virginica"))

## Warning messages:
## 1: In is.na(e1) | is.na(e2) :
##   longer object length is not a multiple of shorter object length
## 2: In `==.default`(Species, c("setosa", "virginica")) :
##   longer object length is not a multiple of shorter object length

您想使用%in%

datanew <- subset(iris, Species %in% c("setosa", "virginica"), select = -Species)

head(datanew)

##   Sepal.Length Sepal.Width Petal.Length Petal.Width
## 1          5.1         3.5          1.4         0.2
## 2          4.9         3.0          1.4         0.2
## 3          4.7         3.2          1.3         0.2
## 4          4.6         3.1          1.5         0.2
## 5          5.0         3.6          1.4         0.2
## 6          5.4         3.9          1.7         0.4

tail(datanew)

##     Sepal.Length Sepal.Width Petal.Length Petal.Width
## 145          6.7         3.3          5.7         2.5
## 146          6.7         3.0          5.2         2.3
## 147          6.3         2.5          5.0         1.9
## 148          6.5         3.0          5.2         2.0
## 149          6.2         3.4          5.4         2.3
## 150          5.9         3.0          5.1         1.8