基于某些其他列值为多个列分配条件值

时间:2017-02-26 05:28:07

标签: arrays r loops if-statement

我一直坚持这个问题,我相信你们中的一些人不会太难解决。我在这个论坛上找不到答案是没有成功的。

我工作的公司有一个轮岗计划,员工在多个部门工作一段时间,在一段时间结束时,他们会接受更高级别部门(晋升)的评估。大多数人将在3年内完成他们的计划,然后在第4和第5完成他们的计划。一小部分(约15%)没有完成该计划。数据集相当大,可以追溯到30多年前。一些数据是手动输入的,容易出现数据输入错误。列cont1cont2,...,cont7标记个人是否仍在旋转程序中。如果员工分别在3年,4年和5年内成功完成了该计划,则prom3prom4prom5列会有'Y'。因此'Y'中的prom3表示'Y'prom4中也会有prom5,因此NA中有cont3 },...,cont7因为此人不再参与轮换计划。如果个人未在第3年晋升,而是在第4年进行宣传,则prom4'Y'cont4,...,cont7为{{ 1}}。现在你看到了问题。问题是我有更多年。我知道我可以使用NA,但代码变得非常混乱和冗长。我希望找到一种解决方案,以更优雅的方式动态地完成这项工作。

如果ifelse()prom3,那么'Y'cont2'Y',...,{{我需要找到一种动态编程的方法1}}是cont3。如果cont7 NA中有id'Y',...,prom4cont4cont7和{{1}是} NA等等。类似的东西:

cont2

对不起上面那么优雅的尝试抱歉!

谢谢你的帮助!!!玩具df以下:

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' 会将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:]。如果有人在3年内晋升,那么其他推广专栏当然也会cont[:digit:]'。正如我之前所说,我可以使用'Y'语句执行此操作,但NA'Y有5年以上,这使得代码读取起来非常笨拙且耗时。< / p>

1 个答案:

答案 0 :(得分:1)

我们可以使用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>