样本数据:
x<-runif(100, min=0, max=1)
y<-runif(100, min=0, max=1)
dif<-x-y
dat<-data.frame(x,dif)
Run Code Online (Sandbox Code Playgroud)
我想要做的是在数据框中创建另一列dat名为suit.如果x小于0.15并且dif小于0,则suit应该具有值3.如果x小于0.15并且dif大于0,则suit应该具有值2并且如果dif大于0,则suit具有值1.
这是我准备的代码.
if(dat$x<0.15 & dat$dif<0){
dat$suit<-3
} else {
if(dat$x>=0.15 & dat$dif<0){
dat$suit<-2
} else {
dat$suit<-1
}
}
Run Code Online (Sandbox Code Playgroud)
它给出了所有的值为dat$suit1.我不确定我在这里做错了什么.
谢谢您的帮助.
这可以使用任何一种方法完成 ifelse
with(dat, ifelse(x < 0.15 & dif <0, 3, ifelse(x > 0.15 & dif < 0, 2, 1)))
Run Code Online (Sandbox Code Playgroud)
要么
with(dat, as.numeric(factor(1+4*(x < 0.15 & dif < 0) + 2*(x>=0.15 & dif < 0))))
Run Code Online (Sandbox Code Playgroud)
您的语句的问题是if只检查测试表达式的第一个元素 - 您应该收到警告. ifelse是矢量化的.
此外,您可以按相反的顺序执行测试,以获得更简单的等效表达式:
with(dat,
ifelse(dif >= 0 , 1 , ifelse(x < 0.15, 3, 2))
)
Run Code Online (Sandbox Code Playgroud)