示例数据:
x<-runif(100, min=0, max=1)
y<-runif(100, min=0, max=1)
dif<-x-y
dat<-data.frame(x,dif)
我想要做的是在名为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
}
}
它将dat$suit
的所有值都设为1.我不确定我在这里做错了什么。
感谢您的帮助。
答案 0 :(得分:7)
可以使用ifelse
with(dat, ifelse(x < 0.15 & dif <0, 3, ifelse(x > 0.15 & dif < 0, 2, 1)))
或者
with(dat, as.numeric(factor(1+4*(x < 0.15 & dif < 0) + 2*(x>=0.15 & dif < 0))))
答案 1 :(得分:5)
你的陈述的问题是if
只检查测试表达式的第一个元素 - 你应该收到警告。 ifelse
已经过矢量化。
此外,您可以按相反的顺序执行测试,以获得更简单的等效表达式:
with(dat,
ifelse(dif >= 0 , 1 , ifelse(x < 0.15, 3, 2))
)