2017-05-09 5 views
0

にチェインするまず最初に、Rのif/else文について多くの質問があることを知っていますが、それらのどれもが私の特定の状況に役立たず、これとしばらくの間闘っている。私はmetricx(リスクと答え)の値に基づいて、2つの新しい変数を作成する必要が複数のdo文を使ってIf-ElseをR

metricx <- c(5, 4.8, 4.4, 3.6, 3.2, 2.1, 1.9, .5, .3, .1) 
df <- as.data.frame(metricx) 

私はこのようになりますデータフレームを持っています。

私は、この作品を知っている....

df$risk <- ifelse(df$metricx >= 4.5, 'VERY HIGH', 'HIGH') 
df$risk <- ifelse(df$metricx < 3.5, 'MEDIUM', df$risk) 
df$risk <- ifelse(df$metricx < 2, 'LOW', df$risk) 

しかし、明らかではない、それを行うには、エレガントなまたは効率的な方法、私はこれを数回行う必要がありますので、(私のデータセットが非常に大きく、私はより多くを持っていますグループより)。私が理解していることは、ifelseが呼ばれるたびにRがすべてのレコードを処理しなければならないということです。

if (df$metricx >= 4.5){ 
    df$risk = 'VERY HIGH' 
    df$answer = 'Y' 
} else if (df$metricx >= 3.5){ 
    df$risk = 'HIGH' 
    df$answer = 'Y' 
} else if (df$metricx >= 2){ 
    df$risk = 'MEDIUM' 
    df$answer = 'Y' 
} else if (df$metricx >= .40){ 
    df$risk = 'LOW' 
    df$answer = 'Y' 
} else { 
    df$risk = 'LOW' 
    df$answer = 'N' 
} 

私はこれを試してみました

...

ifelse(df$metricx >= 4.5, 
     (df$risk <- 'VERY HIGH' & 
     df$answer <- 'Y') 
     , 
ifelse(df$metricx >= 3.5, 
     (df$risk = 'HIGH' & 
     df$answer = 'Y') 
     , 
ifelse(df$metricx >= 2, 
     (df$risk = 'MEDIUM' & 
     df$answer = 'Y') 
     , 
ifelse(df$metricx >= .40, 
     (df$risk = 'LOW' & 
     df$answer = 'Y') 
     , 
(df$risk = 'LOW' & 
df$answer = 'N') 
)  
) 
) 
)  

そして、私はこれを試してみました...そして、彼らは両方とも私が理解することができますどちらも異なるエラーを与えます。私は説明しようとしているいくつかの異なるサイトで騒がしいですが、これをどうやって行うのかまだ分かりません。

私の質問: 1.ソリューションが機能しないのはなぜですか?彼らは私がRのサイトで見た構文に従っているように見えますか? 2.希望の出力を得る正しい方法は何ですか?

risk <- c('VERY HIGH', 'VERY HIGH', 'HIGH', 'HIGH', 'MEDIUM', 'MEDIUM', 'LOW', 'LOW', 'LOW', 'LOW') 
answer <- c('Y','Y','Y','Y','Y','Y','Y','Y','Y', 'N') 

want <- data.frame(metricx, risk, answer) 
+3

ここでは、おそらく 'cut'を使用してください。 – lmo

+0

'ifelse'文のセットは実際には適切な構文や使用法を持っていません。 'if'では使用できないベクトル化された条件を使用しているので、2番目のセットは機能しません。 – Gopala

+0

非常に複雑なものがありますが、実際に統計上の一般的な操作である場合は、この目的のために単純なR関数が存在する可能性が非常に高くなります。あなたはそれを検索すればよい(統計学者が適切な検索語を見つけるために操作に名前を付けるものを考慮する)。 – Roland

答えて

2

私はdplyrを使用していると思いますが、これは正しいですか?

library(dplyr) 
df <- df %>% mutate(risk = cut(metricx, c(0, 2, 3.5, 4.5, 6), 
        labels = c("LOW", "MEDIUM", "HIGH", "VERY HIGH"))) %>% 
    mutate(answer = ifelse(metricx < .4, "N", "Y")) 
+0

これは完全に動作します。他のすべての言語で動作するネストされたif else構文がまだ混乱し、不満を抱いていますが、これは効率的で洗練されたソリューションです。私はカット機能について聞いたことがありませんでした。ありがとうございました。 – pyll

+0

あなたは入れ子の権利を得ていませんでした。それはRの働きをします。3番目の位置では、新しいifelseを閉じるのではなく、それを開始します。あるいは、 'dplyr'から' case_when'をチェックしてください。 – Edwin

1

あなたはいつも答えを持っているので、私はdf $の回答を残しました。お試しください:

metricx <- c(5, 4.8, 4.4, 3.6, 3.2, 2.1, 1.9, .5, .3, .1) 
df <- as.data.frame(metricx) 

myif<-function(x) { 
    if (x<2) y="LOW" else 
    if (x<3.5) y="MEDIUM" else 
     if (x<4.5) y="HIGH" else y="VERY HIGH" 
    return(y) 
} 
sapply(df$metricx,myif) 

# or: 

ifelse(df[1]<2,"LOW", 
     ifelse(df[1]<3.5,"MEDIUM", 
       ifelse(df[1]<4.5,"HIGH","VERY HIGH"))) 

# or (modified later): 

myif<-function(x) { 
    if (x<2) y="LOW" else 
    if (x<3.5) y="MEDIUM" else 
     if (x<4.5) y="HIGH" else y="VERY HIGH" 
     yv<-c(y,if (x<0.4) "N" else "Y") 
     return(yv) 
} 
sapply(df$metricx,myif) 
+0

実際には、答えが「N」の条件があるので、これは質問にはあまり答えません。複数の「do」アクションを組み込むことはできますか、別の呼び出しを行う必要がありますか? – pyll

+0

私は本当に一度に1つのベクトルを計算します。そして、私がそれについて考えているように、上記のカット・アンサーはおそらくそれを行うための最もRのような方法でしょう。 –

+0

はい私はカットが行く方法であることに同意します – pyll

関連する問題