私はこの問題に悩まされており、あなたの中にはこれを解決するのが難しくないと確信しています。私はこのフォーラムで答えを見つけることに成功しなかった。他の列の値に基づいて複数の列に条件付き値を割り当てる
私が働いている会社は、従業員が複数の部門で時間を費やし、ある期間の終わりに、よりシニア部門(昇進)の評価を受ける回転プログラムを持っています。ほとんどの人は3年後にプログラムを終了し、その後4、5日にもう少しプログラムを終了します。小さな割合(約15%)はプログラムを完了しません。データセットはかなり大きく、30年以上前に戻っています。一部のデータは手動で入力され、データ入力間違いが発生しがちです。 cont1
、cont2
、...、cont7
は、個体がまだ回転プログラムにあるかどうかを示すフラグです。 prom3
、prom4
およびprom5
の列は、従業員がそれぞれ3年、4年および5年後にプログラムを正常に完了した場合、'Y'
です。だから、prom3
で'Y'
もcont3
にprom4
とprom5
で'Y'
、その結果NA
があるでしょうことを意味し、...、cont7
人はもはや回転プログラムであるため。個人が3年目に昇進せず、その代わりに4年目にそれを行う場合、prom4
は'Y'
とcont4
、...、cont7
はNA
です。これで、問題が表示されます。問題は、私はより多くの年があるということです。私はifelse()
を使うことができると理解していますが、コードはかなり乱雑で長くなります。私はよりエレガントな方法で、動的にこれを行うためのソリューションを探したいと思います。 prom3
が'Y'
その後、cont2
を持っている場合、私は動的にプログラムへの道を見つける必要があり
は、'Y'
とcont3
で...、cont7
はNA
です。 id
がある場合は'Y'
cont4
、その後prom4
に、...、cont7
はNA
とcont2
とcont3
が'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'
かNA
にcont[: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つで、コードを読みづらいと時間がかかります。
でこれを行うことができますか? – akrun
あなたの投稿を編集してそこに更新してください – akrun
'prom'カラムに既に含まれているデータで' cont'カラムを埋めるだけでは、 'cont'カラムはすべて無関係に見えます。 – N8TRO