条件值分配到多列基于一些列的值

问题描述:

我一直坚持这个问题,我相信对于一些你这不会是太难解决。我在这个论坛找到答案没有成功。条件值分配到多列基于一些列的值

该公司在我的工作有一个旋转程序,使员工花一些时间在多个部门,并在一段时间结束时,他们得到的评价更高级组(推广)。大多数将在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

我们可以可以显示基于对例如你的预期输出与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