R中的If else循环出错

时间:2013-07-19 10:11:36

标签: r error-handling

我在R中编写一个代码。首先,我在数据集中创建一个空白列,并且我想根据某些条件在该列中分配0和1值。这是我的代码

#Creating a empty column in the data file 
Mydata$final <- "";

#To assign 0,1 value in final variable
if(Mydata$Default_Config == "No" & is.na(Mydata$Best_Config)=="TRUE" & (Mydata$AlmostDefaultConfig!=1 | Mydata$AlmostDefaultConfig!=3)){
  Mydata$final <- 1
  }else{
  Mydata$final <- 0  
  }

我收到此错误

Warning message:
In if (Mydata$Default_Config == "No" & is.na(Mydata$Best_Config) ==  :
  the condition has length > 1 and only the first element will be used

如何解决此错误?请帮帮我。提前致谢

2 个答案:

答案 0 :(得分:0)

你的问题是矢量化问题。 if未进行矢量化。您正在if语句中的每个比较中测试多个值,并且R告诉您它将仅使用第一个,因为if未被矢量化。你需要ifelse,它是矢量化的:

ifelse( Mydata$Default_Config == "No" & is.na(Mydata$Best_Config)=="TRUE" & (Mydata$AlmostDefaultConfig!=1 | Mydata$AlmostDefaultConfig!=3) , 1 , 0 )

下面是一个可重现的例子。如果x> 5且y为偶数,则返回1,否则返回0

x <- 1:10
# [1]  1  2  3  4  5  6  7  8  9 10

y <- seq(1,30,3)
# [1]  1  4  7 10 13 16 19 22 25 28

x > 5
# [1] FALSE FALSE FALSE FALSE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE

y %% 2 == 0
# [1] FALSE  TRUE FALSE  TRUE FALSE  TRUE FALSE  TRUE FALSE  TRUE

ifelse( x > 5 & y %% 2 == 0 , 1 , 0 )
# [1] 0 0 0 0 0 1 0 1 0 1

答案 1 :(得分:0)

另一种方法是利用R的强制。你有一组可矢量化的条件,R很乐意将TRUE / FALSE转换为1/0,所以你可以这样写:

Mydata$final <- (  (Mydata$Default_Config == "No") *( is.na(Mydata$Best_Config)=="TRUE") *  (Mydata$AlmostDefaultConfig!=1 +  Mydata$AlmostDefaultConfig!=3))  )

(为清晰起见,添加了额外的括号)。 如果我在那里弄错了逻辑,请道歉。

编辑:我的OR代码不能正常工作,因为如果双方都是正确的,你会得到一个大数字(“2”:-))。将其更改为as.logical((Mydata$AlmostDefaultConfig!=1 + Mydata$AlmostDefaultConfig!=3))