条件值分配到多列基于一些列的值
我一直坚持这个问题,我相信对于一些你这不会是太难解决。我在这个论坛找到答案没有成功。条件值分配到多列基于一些列的值
该公司在我的工作有一个旋转程序,使员工花一些时间在多个部门,并在一段时间结束时,他们得到的评价更高级组(推广)。大多数将在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年多的时间,这使得代码非常难以阅读和耗时。
我们可以可以显示基于对例如你的预期输出与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>
谢谢,作品像魅力。 – JdM
做到这一点? – akrun
请修改您的帖子并在那里更新 – akrun
如果您只是用已包含在'prom'列中的数据填充它们,似乎所有'cont'列都是无关紧要的。 – N8TRO