我一直坚持这个问题,我相信你们中的一些人不会太难解决。我在这个论坛上找不到答案是没有成功的。
我工作的公司有一个轮岗计划,员工在多个部门工作一段时间,在一段时间结束时,他们会接受更高级别部门(晋升)的评估。大多数人将在3年内完成他们的计划,然后在第4和第5完成他们的计划。一小部分(约15%)没有完成该计划。数据集相当大,可以追溯到30多年前。一些数据是手动输入的,容易出现数据输入错误。列cont1
,cont2
,...,cont7
标记个人是否仍在旋转程序中。如果员工分别在3年,4年和5年内成功完成了该计划,则prom3
,prom4
和prom5
列会有'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'
,...,prom4
为cont4
,cont7
和{{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>
答案 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>