我试图通过我做的逻辑回归对客户进行评分。在计算了它们的概率之后,我创建了一个包含这些变量的数据框: 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语句?
感谢。
答案 0 :(得分:2)
您在这里不需要if
和else
。您可以使用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)