R中的if-then-else语句

时间:2017-01-23 14:57:10

标签: r if-statement

我试图通过我做的逻辑回归对客户进行评分。在计算了它们的概率之后,我创建了一个包含这些变量的数据框: CUSTID,depvar,prob 接下来,我能够得到概率的十分位数。

> quantile(prob, p=seq(0, 1, length=11), type=5)
       0%       10%       20%       30%       40%       50%       60%       70%       80%       90%      100% 
0.0373546 0.1990744 0.2961668 0.3748728 0.4393759 0.4970248 0.5554679 0.6162423 0.6905081 0.8007684 0.9999996 

最后,我想将十分位数附加到数据框的末尾。这是我的代码:

> #Chained if-then-else
> if (prob <=.1990744) {decile<-10} else if (prob >.1990744) {decile<-9} else if (prob >.2961668){decile<-8} else {if (prob >.3748728) {decile<-7} else if(prob >.4393759) {decile<-6} else if (prob >.4970248){decile<-5} else {if (prob >.5554679) {decile<-4} else if(prob >.6162423) {decile<-3} else if (prob >.6905081){decile<-2} else {if (prob >.8007684) {decile<-1} else {decile=0}
+ 

如你所见,我留下一个+号,好像R期待我输入别的东西。我该如何构造这个if-then-else语句?

感谢。

3 个答案:

答案 0 :(得分:2)

您在这里不需要ifelse。您可以使用cut标记类别。

首先是一些示例数据,因为您没有提供可重现的示例:

set.seed(1)
dat <- data.frame(prob = rnorm(100))

计算十分位数:

quant <- quantile(dat$prob, probs = seq(0, 1, length.out = 11), type = 5)

使用cut标记相对于十分位数的连续值:

dat2 <- transform(dat, decile = cut(prob, c(-Inf, quant), labels = 0:10))

head(dat2)    
#         prob decile
# 1 -0.6264538      2
# 2  0.1836433      6
# 3 -0.8356286      2
# 4  1.5952808     10
# 5  0.3295078      6
# 6 -0.8204684      2

答案 1 :(得分:1)

只是为了解释它为什么不起作用:

if (prob <=.1990744) {
  decile<-10
} else if (prob >.1990744) {
  decile<-9
} else if (prob >.2961668) {
  decile<-8
} else { # Here
  if (prob >.3748728) {
    decile<-7
  } else if(prob >.4393759) {
    decile<-6
  } else if (prob >.4970248) {
    decile<-5
  } else {
    if (prob >.5554679) {
      decile<-4
    } else if(prob >.6162423) {
      decile<-3
    } else if (prob >.6905081) {
      decile<-2 
    } else { # and there
      if (prob >.8007684) {
        decile<-1
      } else {
        decile=0
      }

你可以在那里看到两个有开口括号的地方。删除它们,或在代码末尾添加2来修复它。

真的,如@Sven所示使用cut,这个答案只是为了展示为什么格式化代码会帮助你找到问题。

答案 2 :(得分:-1)

这是一个使用ifelse的答案,首先制作数据集:

set.seed(123)
df <- data.frame(prob = rnorm(10, mean= 0.5, sd = 0.3), decile = NA)

然后这个:

attach(df) 

df$decile <-ifelse(prob <=.1990744, 10, 
        ifelse(prob <.2961668, 9,
        ifelse(prob <.3748728, 8,
        ifelse(prob <.4393759, 7,
        ifelse(prob <.4970248, 6,
        ifelse(prob <.5554679, 5,
        ifelse(prob <.6162423, 4,
        ifelse(prob <.6905081, 3,
        ifelse(prob <.8007684, 2, 
        ifelse(prob <.9999996, 1, 0))))))))))

detach(df)