2017-08-09 7 views
2

SO/Rの新機能です。私は単純なif/elseステートメントをRで動作させようとしています。これは列を作成し、異なる列の値に基づいてHigh/Medium/Lowの3つのカテゴリを設定します。このエラーを返すネストされた 'ifelse'ステートメント: 'マルチ引数は' first '、' last 'または' all ''に限ります。

私が得ているエラーは、 'マルチ引数は' first '、' last 'または' all 'のみになります。私はこのエラーに関する驚くほど小さな文書を見つけました。私の問題は単純なものになる可能性が高いことが分かりました。

私はこれについて非常に新しいことをもう一度繰り返す。ご協力いただきありがとうございます。より効率的な方法も、私が聞いているところにはとてもオープンです。

zips3[, PW_Data := ifelse(pctr08zip_updated > 0.4 & pctr08zip_updated <=0.5), "Poop", 
            ifelse(pctr08zip_updated > 0.5 & pctr08zip_updated <=0.6), "Poop2", 
              ifelse(pctr08zip_updated > 0.6 & pctr08zip_updated <=0.7), "South", "Exclude"] 
+0

あなたは 'dplyr :: case_when'をチェックアウトする必要があります。 – roarkz

答えて

2

問題は、あなたがあなたのdata.tableに追加の引数を渡す意味し、あなたの(と)適切に一致しないとやってifelse、すべてとは何の関係もありません。構文はのようにifelse(1:3 < 3, TRUE, FALSE)で、ifelse(1:3 < 3), TRUE, FALSE)ではなく、正しく動作しません。

library(data.table) 
zips3 <- data.table(pctr08zip_updated=seq(0L,10L,1L)/10) 

zips3[, 
    PW_Data := 
    ifelse(pctr08zip_updated > 0.4 & pctr08zip_updated <=0.5, "Poop", 
    ifelse(pctr08zip_updated > 0.5 & pctr08zip_updated <=0.6, "Poop2", 
    ifelse(pctr08zip_updated > 0.6 & pctr08zip_updated <=0.7, "South", 
    "Exclude"))) 
] 

Reは:より効率的な方法は、カット点の系列によって定義されたセグメントにベクトルをチョップします?cutを参照し、標識することができる因子変数を返す例えば、あなたの括弧に一致することは、正常に動作させます適切に。

labs <- c("Exclude","Poop","Poop2","South","Exclude") 
zips3[, PW_Data_cut := labs[cut(pctr08zip_updated, c(-Inf,0.4,0.5,0.6,0.7,Inf))] ] 

範囲外の上限値と下限値の出力が重複しているので、ここではラベルを別々に指定します。

identical(zips3$PW_Data, zips3$PW_Data_cut) 
#[1] TRUE 
関連する問題