我在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
如何解决此错误?请帮帮我。提前致谢
答案 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))