基本上在SAS中,我可以在没有else的情况下执行if语句.例如:
if species='setosa' then species='regular';
Run Code Online (Sandbox Code Playgroud)
没有其他需要.
如何在R中做到?这是我下面的脚本不起作用:
attach(iris)
iris2 <- iris
iris2$Species <- ifelse(iris2$Species=='setosa',iris2$Species <- 'regular',iris2$Species <- iris2$Species)
table(iris2$Species)
Run Code Online (Sandbox Code Playgroud)
Gre*_*gor 18
几个选项.最好的是只做替换,这很好,干净:
iris2$Species[iris2$Species == 'setosa'] <- 'regular'
Run Code Online (Sandbox Code Playgroud)
ifelse
返回一个向量,因此在这种情况下使用它的方法是用新创建的列替换该列ifelse
.不要在里面做作业ifelse
!
iris2$Species <- ifelse(iris2$Species=='setosa', 'regular', iris2$Species)
Run Code Online (Sandbox Code Playgroud)
但是,ifelse
如果else保持"保持不变",则很少需要使用- 直接替换子集(此答案中的第一行代码)更好.
好的,所以上面发布的代码实际上并不起作用 - 这是因为它iris$Species
是一个factor
(分类)变量,而'regular'
不是其中一个类别.处理此问题的最简单方法是character
在编辑之前强制变量:
iris2$Species <- as.character(iris2$Species)
iris2$Species[iris2$Species == 'setosa'] <- 'regular'
Run Code Online (Sandbox Code Playgroud)
其他方法也可以,(直接编辑因子水平或重新分解和指定新标签),但这不是你问题的焦点所以我认为它超出了答案的范围.
另外,正如我在评论中所说,不要使用attach
.如果你不小心它,你最终可能会导致列不同步,从而产生恼人的错误.(在您发布的代码中,您还没有使用它 - 如果删除该attach
行,其余的也会运行.)