2017-02-26 131 views
1

我一直堅持這個問題,我相信對於一些你這不會是太難解決。我在這個論壇找到答案沒有成功。條件值分配到多列基於一些列的值

該公司在我的工作有一個旋轉程序,使員工花一些時間在多個部門,並在一段時間結束時,他們得到的評價更高級組(推廣)。大多數將在3年內完成他們的計劃,然後在第4和第5年完成。一小部分(約15%)沒有完成該計劃。該數據集相當大,可以追溯到30多年。有些數據是手動輸入的,容易出現數據輸入錯誤。列cont1cont2,...,個別cont7標誌是否仍然在旋轉程序。列prom3prom4prom5具有'Y'如果僱員已成功分別完成計劃在3,4和5年。因此,在一個prom3'Y'意味着也將在prom4prom5'Y',以及因此NAcont3,...,cont7因爲人是在旋轉程序不再。如果一個人沒有在今年3晉升但是,相反,這樣做在今年4,然後prom4'Y'cont4,...,cont7NA。現在你看到了問題。問題是我有更多年。我知道我可以使用ifelse(),但代碼變得非常混亂和漫長。我想找到一個解決方案,以更優雅的方式動態執行此操作。

我需要找到一種方法來動態地計劃,如果prom3'Y'然後cont2'Y'cont3,...,cont7NA。如果id'Y'prom4然後cont4,...,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:

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年多的時間,這使得代碼非常難以閱讀和耗時。

+0

做到這一點? – akrun

+0

請修改您的帖子並在那裏更新 – akrun

+0

如果您只是用已包含在'prom'列中的數據填充它們,似乎所有'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