我仍然在学习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
我根本就没有得到它......
答案 0 :(得分:5)
您可以在ifelse
个文档中阅读
ifelse
返回一个与填充的test
形状相同的值 选择是或否的元素取决于是否test
的元素为TRUE
或FALSE
。
因此,如果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 ...
ifelse
和if ... else ...
是不同的功能,ifelse
不是另一个功能的单行。 ifelse
执行的操作是通过某个对象来替换此对象中的值,具体取决于{em}每个值返回test
或TRUE
的{{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])