if()和ifelse()函数之间的区别

时间:2014-03-16 06:26:27

标签: r if-statement

我想要伪代码,即为列Species创建标志变量。

我写了下面的代码:

create_dummies <- function(data, categorical_preds){
    if (categorical_preds == "setosa"){data$setosa_flg <- 1}
    else {data$setosa_flg <- 0}
    if (categorical_preds == "versicolor"){data$versicolor_flg <- 1}
    else {data$versicolor_flg <- 0}
    if (categorical_preds == "virginica"){data$virginica_flg <- 1}
    else {data$virginica_flg <- 0}
    return(data)
}
create_dummies(iris,iris$Species)

我收到了警告:

Warning messages:
1: In if (categorical_preds == "setosa") { :
  the condition has length > 1 and only the first element will be used
2: In if (categorical_preds == "versicolor") { :
  the condition has length > 1 and only the first element will be used
3: In if (categorical_preds == "virginica") { :
  the condition has length > 1 and only the first element will be used

然后我将代码更改为:

create_dummies <- function(data, categorical_preds){
    ifelse(categorical_preds == "setosa",data$setosa_flg <- 1,data$setosa_flg <- 0)
    ifelse(categorical_preds == "versicolor",data$versicolor_flg <- 1,data$versicolor_flg <- 0)
    ifelse(categorical_preds == "virginica",data$virginica_flg <- 1,data$virginica_flg <- 0)

    return(data)
}
create_dummies(iris,iris$Species)

这次没有警告,但新的虚拟变量始终为0.

作为下一步,我想避免硬编码,所以我写了

create_dummies <- function(data, categorical_preds){
catvar <- (unique(categorical_preds))

for (i in 1:length(catvar)){
  iris[catvar[i]] <- ifelse(iris$Species == catvar[i],1,0)
}
return(data)
}
create_dummies(iris,iris$Species)

这有什么问题?

问题:

  1. 为什么2个版本的代码无效?

  2. R中if(){}ifelse()函数的区别是什么?

  3. ifelse()中,如果条件为true,我该如何进行多项操作?
    例如:ifelse(categorical_preds == "setosa",data$setosa_flg <- 1 print(iris$Species),data$setosa_flg <- 0)

3 个答案:

答案 0 :(得分:4)

警告信息:

  the condition has length > 1 and only the first element will be used

告诉您在if条件下使用向量相当于使用其第一个元素:

[if (v == 1)] ~ [if (v[1] == 1)] ## v here is a vector

您应该使用矢量化ifelse。例如,你可以写下这样的条件:

create_dummies<-function(data, categorical_preds){
  ## here I show only the first condition 
  data$setosa_flg <-
       ifelse (categorical_preds=="setosa",1,0)
  data
}

答案 1 :(得分:1)

iris$Species是一个向量。 if语句是一个控制语句,旨在仅对标量布尔条件起作用。在R中,当你将一个向量与一个字符串进行比较时,输出是一个布尔值向量,告诉你向量的每个元素是否等于字符串。

答案 2 :(得分:0)

在构建函数时应使用

If else,以便在给定的codition为true时运行给定的函数的某些部分(一个条件,长度== 1)。您应该在转换data.frame时使用ifelse

if else的帮助:

  

cond长度为1的非逻辑向量。长度条件   大于一个被接受警告,但只有第一个   元素被使用。如果可能,其他类型被强制为逻辑,   无视任何阶级。

为此目的(如果vector是factor),您可以使用model.matrix创建虚拟变量。

mat<-model.matrix(~iris$Species-1)
mat<-as.data.frame(mat)
names(mat)<-unique(iris$Species)

> str(mat)
'data.frame':   150 obs. of  3 variables:
 $ setosa    : num  1 1 1 1 1 1 1 1 1 1 ...
 $ versicolor: num  0 0 0 0 0 0 0 0 0 0 ...
 $ virginica : num  0 0 0 0 0 0 0 0 0 0 ...