R-

2017-01-23 4 views
-1

のIf-then-elseステートメント私はロジスティック回帰から得点を得ようとしています。彼らの確率を計算した後、私はこれらの変数を持つデータフレームを作成しました: CUSTID、depvar、prob 次に、確率のデシールを得ることができました。R-

> 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ステートメントをどのように構築すればよいですか?

ありがとうございました。

+2

'+'は、かっこの不一致の結果です。とにかくここで 'if'と' else'を使うことはできません。ベクトル化されたネスト 'ifelse'を使うことができますが、' cut'や 'findInterval'を使うべきです。 – Roland

+0

@Rolandのコメントを完成させるには、コードを再フォーマットした後、 'else'と' if'の間に '{'があり、else {if'を探します。このような長いステートメントや、イントントステートメントをインデントするためのスクリプトを試してみてください。 – Tensibai

答えて

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 
+0

最後に追加の閉じかっこが必要でした。私は解決策を得た。 – WillCoop4

+0

ご連絡ありがとうございました。 – WillCoop4

-1

ifelseを使用したこの回答、最初のmakeデータセット:

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) 
+1

'attach'と' detach'を使うと、大規模なコードベースではあなたの人生が非常に難しくなります。さらに、 'cut'を使うことができるので、非常に多くのネストされた' ifelse'ステートメントの使用は必要ありません。 –

+0

if-then-elseが1つか2つしかない場合は、私を参考にして使用します。ありがとう。 – WillCoop4

+0

@ WillCoop4の私には、なぜこのソリューションを最適なソリューションにフラグを立てるのか不明です。明らかな選択肢は、Svenの 'cut'答えです。 –

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つの場所があります見ることができます。それらを削除するか、コードの最後に2を加えて修正してください。

実際には、@ Svenのようにcutを使用してください。この回答は、コードを書式設定することで問題を発見するのに役立つでしょう。

+0

私は同意する前にcut文を使用していませんでした。それは助けになった。ありがとう。 – WillCoop4