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

rpl*_*rpl 2 if-statement r 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,])
Run Code Online (Sandbox Code Playgroud)

我希望上面的内容能够返回原始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
Run Code Online (Sandbox Code Playgroud)

我根本就没弄明白......

Tim*_*Tim 5

你可以在ifelse文档中阅读

ifelse作为返回具有相同形状的值test填充有从任一选择是或元素没有根据的元素是否testTRUEFALSE.

因此,如果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
Run Code Online (Sandbox Code Playgroud)

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

if (condition) ... else ...
Run Code Online (Sandbox Code Playgroud)

ifelseif ... else ...不同的功能,ifelse不是一个班轮为其他功能.什么ifelse所做的是它经历了一些对象,并基于此的一些替代对象的值test返回TRUEFALSE每个被替换值.