R:ifelse,根据条件返回子集

时间:2015-10-22 07:52:51

标签: r if-statement subset

我仍然在学习R并且碰到了一些超出我理解的东西。我花了2个小时试图自己搞清楚并且失败了:-(。

我有一个data.frame(让我们想起iris,例如)我想用 ifelse 进行子集化。如果第一行是" setosa",我想要一个带有前50行的data.frame,如果没有,则需要接下来的100行。见下文。

data (iris)
a <- ifelse(iris$Species[1] == "setosa", iris[1:50,],iris[51:150,])

我希望上面的内容能够返回原始data.frame的子集,但实际上我得到的是

[[1]]
 [1] 5.1 4.9 4.7 4.6 5.0 5.4 4.6 5.0 4.4 4.9 5.4 4.8 4.8 4.3 5.8 5.7 5.4 5.1 5.7 5.1 5.4 5.1 4.6
[24] 5.1 4.8 5.0 5.0 5.2 5.2 4.7 4.8 5.4 5.2 5.5 4.9 5.0 5.5 4.9 4.4 5.1 5.0 4.5 4.4 5.0 5.1 4.8
[47] 5.1 4.6 5.3 5.0

我根本就没有得到它......

3 个答案:

答案 0 :(得分:5)

您可以在ifelse个文档中阅读

  

ifelse返回一个与填充的test形状相同的值   选择是或否的元素取决于是否   test的元素为TRUEFALSE

因此,如果test是一个向量,它将返回一个向量,如果它是单个值,则返回一个值等。如果提供错误的参数,则会产生垃圾结果。举例

> ifelse(1:10<5, 1, 0)
[1] 1 1 1 1 0 0 0 0 0 0
> ifelse(1:10<5, 0, 1:10)
[1]  0  0  0  0  5  6  7  8  9 10
> ifelse(TRUE, 1, 0)
[1] 1
> ifelse(TRUE, 1:10, 0)
[1] 1

在你的情况下,你应该使用

if (condition) ... else ...

ifelseif ... else ...是不同的功能,ifelse 是另一个功能的单行。 ifelse执行的操作是通过某个对象来替换此对象中的值,具体取决于{em}每个值返回testTRUE的{​​{1}}被替换。

答案 1 :(得分:0)

if (iris$Species[1] == "setosa") a <- iris[1:50,] else a <- iris[51:150,]

a <- if (iris$Species[1] == "setosa") iris[1:50,] else iris[51:150,]

答案 2 :(得分:0)

上面给出了对ifelse问题的回答。 然后,根据您的实际应用,您也可以通过这种方式进行分组:

subset(iris, Species==Species[1])