我尝试使用以下代码对虹膜数据进行子集化
datanew = subset(iris, Species == c("setosa", "virginica"), select = -Species)
但我得到的结果只有1,3,5,7 ......行。为什么我最终得到奇怪的行?
答案 0 :(得分:6)
简短回答:因为矢量回收,http://cran.r-project.org/doc/manuals/R-intro.html#Vector-arithmetic。
答案很长:当您对表单x == y
进行比较时,如果向量x
和y
不具有相同的长度,则会将短文本重新匹配以匹配长长的。
例如,
> 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