2017-02-26 8 views
1

私はこの問題に悩まされており、あなたの中にはこれを解決するのが難しくないと確信しています。私はこのフォーラムで答えを見つけることに成功しなかった。他の列の値に基づいて複数の列に条件付き値を割り当てる

私が働いている会社は、従業員が複数の部門で時間を費やし、ある期間の終わりに、よりシニア部門(昇進)の評価を受ける回転プログラムを持っています。ほとんどの人は3年後にプログラムを終了し、その後4、5日にもう少しプログラムを終了します。小さな割合(約15%)はプログラムを完了しません。データセットはかなり大きく、30年以上前に戻っています。一部のデータは手動で入力され、データ入力間違いが発生しがちです。 cont1cont2、...、cont7は、個体がまだ回転プログラムにあるかどうかを示すフラグです。 prom3prom4およびprom5の列は、従業員がそれぞれ3年、4年および5年後にプログラムを正常に完了した場合、'Y'です。だから、prom3'Y'cont3prom4prom5'Y'、その結果NAがあるでしょうことを意味し、...、cont7人はもはや回転プログラムであるため。個人が3年目に昇進せず、その代わりに4年目にそれを行う場合、prom4'Y'cont4、...、cont7NAです。これで、問題が表示されます。問題は、私はより多くの年があるということです。私はifelse()を使うことができると理解していますが、コードはかなり乱雑で長くなります。私はよりエレガントな方法で、動的にこれを行うためのソリューションを探したいと思います。 prom3'Y'その後、cont2を持っている場合、私は動的にプログラムへの道を見つける必要があり

は、'Y'cont3で...、cont7NAです。 idがある場合は'Y'cont4、その後prom4に、...、cont7NAcont2cont3'Y'などです。次のようなもの:

contYears <- seq(2,7, by=1) 

promYears <- seq(3,5, by=1) 

if (paste0("prom",promYears)=='Y'){ 
is.na(paste0("cont",contYears)) while contYears >= promYears)} 
else paste0("cont",contYears)=='Y' 

申し訳ありませんが、上記のように試してみてください!

ありがとうございました!おもちゃのDFの下には:だからprom[:digit:]'Y'NAcont[:digit:]列をトリガー

id cont2 cont3 cont4 cont5 cont6 cont7 prom3 prom4 prom5 
1  Y  Y  Y <NA> <NA> <NA> <NA> <NA>  Y 
2  Y <NA> <NA> <NA> <NA> <NA>  Y  Y  Y 
3  Y  Y <NA> <NA> <NA> <NA> <NA>  Y  Y 
4  Y  Y  Y <NA> <NA> <NA> <NA> <NA>  Y 
5  Y  Y <NA> <NA> <NA> <NA> <NA>  Y  Y 
6  Y  Y  Y  Y  Y  Y <NA> <NA> <NA> 

:ここ

set.seed(123) 
df <- tibble::data_frame(id = seq(1,100, by=1), 
        cont2 = sample(c('Y', NA), 100, replace=T, prob = c(0.9, 0.1)), 
        cont3 = sample(c('Y', NA), 100, replace=T, prob = c(0.8, 0.2)), 
        cont4 = sample(c('Y', NA), 100, replace=T, prob = c(0.5, 0.5)), 
        cont5 = sample(c('Y', NA), 100, replace=T, prob = c(0.25,0.75)), 
        cont6 = sample(c('Y', NA), 100, replace=T, prob = c(0.15,0.85)), 
        cont7 = sample(c('Y', NA), 100, replace=T, prob = c(0.10,0.9)), 
        prom3 = sample(c('Y', NA), 100, replace=T, prob = c(0.5,0.5)), 
        prom4 = sample(c('Y', NA), 100, replace=T, prob = c(0.75,0.25)), 
        prom5 = sample(c('Y', NA), 100, replace=T, prob = c(0.85,0.15))) 

head(df) 

id cont2 cont3 cont4 cont5 cont6 cont7 prom3 prom4 prom5 
1  Y  Y  Y <NA>  Y <NA> <NA> <NA>  Y 
2  Y  Y  Y  Y <NA> <NA>  Y  Y  Y 
3  Y  Y  Y <NA>  Y <NA> <NA>  Y  Y 
4  Y  Y  Y <NA> <NA> <NA> <NA> <NA>  Y 
5  Y  Y  Y <NA> <NA> <NA> <NA>  Y  Y 
6 <NA>  Y <NA> <NA> <NA> <NA> <NA> <NA> <NA> 

は、出力は次のようになります方法です。誰かが3年以内に昇進した場合、もちろん他のプロモーションコラムは'Y 'となります。前に言ったように、私はifelse()のステートメントでこれを行うことができますが、私はcont[:digit:]の場合7年以上、prom[:digit:]の場合5つで、コードを読みづらいと時間がかかります。

+0

でこれを行うことができますか? – akrun

+0

あなたの投稿を編集してそこに更新してください – akrun

+0

'prom'カラムに既に含まれているデータで' cont'カラムを埋めるだけでは、 'cont'カラムはすべて無関係に見えます。 – N8TRO

答えて

0

私たちは、あなたが例に基づいて予想される出力を表示することができますapply

df[grep("cont", names(df))] <- t(apply(df[-1], 1, FUN= function(x) { 
     i1 <- seq_len(6)>which.max(x[7:9]=="Y") 
     if(length(i1)>0) replace(x[1:6], i1, NA) else rep("Y", 6)})) 
head(df, 6) 
# id cont2 cont3 cont4 cont5 cont6 cont7 prom3 prom4 prom5 
#1 1  Y  Y  Y <NA> <NA> <NA> <NA> <NA>  Y 
#2 2  Y <NA> <NA> <NA> <NA> <NA>  Y  Y  Y 
#3 3  Y  Y <NA> <NA> <NA> <NA> <NA>  Y  Y 
#4 4  Y  Y  Y <NA> <NA> <NA> <NA> <NA>  Y 
#5 5  Y  Y <NA> <NA> <NA> <NA> <NA>  Y  Y 
#6 6  Y  Y  Y  Y  Y  Y <NA> <NA> <NA> 
+1

ありがとうございます、魅力のように動作します。 – JdM

関連する問題