我一直堅持這個問題,我相信對於一些你這不會是太難解決。我在這個論壇找到答案沒有成功。條件值分配到多列基於一些列的值
該公司在我的工作有一個旋轉程序,使員工花一些時間在多個部門,並在一段時間結束時,他們得到的評價更高級組(推廣)。大多數將在3年內完成他們的計劃,然後在第4和第5年完成。一小部分(約15%)沒有完成該計劃。該數據集相當大,可以追溯到30多年。有些數據是手動輸入的,容易出現數據輸入錯誤。列cont1
,cont2
,...,個別cont7
標誌是否仍然在旋轉程序。列prom3
,prom4
和prom5
具有'Y'
如果僱員已成功分別完成計劃在3,4和5年。因此,在一個prom3
'Y'
意味着也將在prom4
和prom5
的'Y'
,以及因此NA
在cont3
,...,cont7
因爲人是在旋轉程序不再。如果一個人沒有在今年3晉升但是,相反,這樣做在今年4,然後prom4
是'Y'
和cont4
,...,cont7
是NA
。現在你看到了問題。問題是我有更多年。我知道我可以使用ifelse()
,但代碼變得非常混亂和漫長。我想找到一個解決方案,以更優雅的方式動態執行此操作。
我需要找到一種方法來動態地計劃,如果prom3
有'Y'
然後cont2
是'Y'
和cont3
,...,cont7
是NA
。如果id
有'Y'
在prom4
然後cont4
,...,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:
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>
下面是輸出應該什麼樣子:
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>
所以prom[:digit:]
觸發cont[:digit:]
列'Y'
或NA
。如果有人在三年內晉升,那麼當然其他晉升專欄也將是'Y
'。正如我之前所說,我可以通過ifelse()
聲明來做到這一點,但對於cont[:digit:]
和prom[:digit:]
,我有7年多的時間,這使得代碼非常難以閱讀和耗時。
做到這一點? – akrun
請修改您的帖子並在那裏更新 – akrun
如果您只是用已包含在'prom'列中的數據填充它們,似乎所有'cont'列都是無關緊要的。 – N8TRO