2017-06-22 52 views
0

对我来说,我有什么似乎是一个非常复杂的R循环来执行一组数据以确定是否雇员目前被称为或雇用(我是数据分析师谁现在担任数据分析师和数据科学家)。为了使它更复杂,我想知道他们是否被称为特定的工作代码或不。我将概述1)我需要什么和2)什么会是惊人的。R循环创建虚拟编码字段

样本数据:

EMPLID Jobcode Job.Entry.Date Term.Date 
1 147935 100880  2016-09-04  <NA> 
2 147935 100884  2015-07-27  <NA> 
3 147935 100887  2013-07-28  <NA> 
4 147935 100887  2013-07-28 2015-03-23 
5 147935 100889  2012-12-18  <NA> 
6 1510844 100890  2013-06-30  <NA> 
7 1510844 100890  2013-07-21  <NA> 
8 1510844 100890  2016-07-10  <NA> 
9 1510844 100895  2006-01-04  <NA> 
10 1510844 100895  2016-04-10  <NA> 
11 1510844 100895  2016-09-04  <NA> 

1)我想创建一个新的领域,我们的电话是 “TermCode”,其中以下是满足:

1 = EMPLID最近的期限。日期在最近的Job.Entry.Date之后(即,EMPLID是TERMED)

0 = EMPLID最近的Job.Entry.Date在最近的Term.Date之后(即,EMPLID未被TERMED )。

这很复杂,因为一些EMPLID有多个Term.Dates和多个Job.Entry.Dates,它们并不总是在同一行上。

2)同样的事情,除了1我想“TermCode”生成以下:

1 = EMPLID最近Term.Date是最近Job.Entry.Date之后和一个以下作业代码(%c中的作业代码%(“101545”,“101318”,“100897”,“100895”,“100891”,“100885”,“100884”,“100880”,“100879”,“100875 “,”100873“))(即EMPLID TERMED作为这些JobCodes之一)

0 = EMPLID最近的Job.Entry.Date在最近的Term.Date之后(即,EMPLID不是TERMED )

2 =的EMPLID最近Term.Date是最近Job.Entry.Date之后和其他任何工作守则(即高于11个JobCodes以外称为EMPLID)

回答

1

很难说什么你在问,但也许这有帮助。我认为下面的代码会让你第一步,你可以使用这个逻辑进行第二步。

library(dplyr) 
df %>% 
    group_by(EMPLID) %>% 
    mutate(entry_date_max = max(Job.Entry.Date), 
    TermCode = ifelse(!is.na(Term.Date) & Term.Date > entry_date_max, 1, 0)) 
+0

这让我着迷,最好的解释%>%?无论如何,它还会使每个EMPLID产生一行,而EMPLID的最大数量是什么? –

+0

这是一个很好的描述:http://r4ds.had.co.nz/pipes.html。只产生一个线路切换出“mutate”为“汇总”。 – roarkz

+0

非常感谢@Zak!当我用“汇总”替换“mutate”时,我得到了一个关于“期待单个值”的错误,我假设这是因为我使用了max而不是sum。我尝试使用以下但无效:jobentrydat_termcodes <-jobentrydat_alltechs%>% group_by(EMPLID)%>% 汇总(entry_date_max = max(Job.Entry.Date), TermCode = unique(ifelse(!is.na (Term.Date)&Term.Date> entry_date_max,1,0))) –