首页 > 解决方案 > 在 R 中以长格式数据指定多个条件

问题描述

如何使用规范索引我需要的行?

id<-c(65,65,65,65,65,900,900,900,900,900,900,211,211,211,211,211,211,211,45,45,45,45,45,45,45)
age<-c(19,22,23,24,25,21,26,31,32,37,38,22,23,25,28,29,31,32,30,31,36,39,42,44,48)
stat<-c('intern','reg','manage1','left','reg','manage1','manage2','left','reg',
        'reg','left','intern','left','intern','reg','left','reg','manage1','reg','left','intern','manage1','left','reg','manage2')

mydf<-data.frame(id,age,stat)

我需要创建 5 个变量:

  1. m01time & m12time:衡量成为一级经理(manage1)之前经过的年数,然后从manage1到manage2,不管它是否在同一个工作。(以年为单位的数字)
  2. change:记录他们是否在 manage1 和 manage2 之间经历过工作变动(如果“left”发生在 manage1 和 manage2 之间的某处),(0 或 1)
  3. & 4: m1p & m2p: 在成为 manager1 和 manager2 (intern, reg, or manage1) 之前占领职位。

这里有很多我不需要的信息,我不确定如何忽略(所有工作 211 在成为经理之前都经历过)。

最终结果应如下所示:

   id m01time m02time change    m1p     m2p
1  65       4      NA     NA    reg    <NA>
2 900      NA       5      0   <NA> manage1
3 211       1      NA     NA    reg    <NA>
4  45       3       9      1 intern     reg

我尝试将 ifelse 与 lag() 和 lead() 一起使用来捕获一些条件,但还有更多 for 循环类型的作业(例如如何捕获介于两者之间的“左”)我不知道该怎么做.

标签: rdplyrdata.table

解决方案


我会以不同于m1p和的方式计算前三个变量的变量m2p。也许有一种我目前看不到的优雅统一的方法。

因此,对于经理之前的最后一个职位,您可以:

mydt <- data.table(mydf)
mydt[,.(m1p=stat[.I[stat=="manage1"]-1],
        m2p=stat[.I[stat=="manage2"]-1]),by=id]

其他变量更方便地以宽 data.format 计算:

dt <- dcast(unique(mydt,by=c("id","stat")), 
           formula=id~stat,value.var="age")
dt[,.(m01time = manage1-intern,
      m12time = manage2-manage1,
      change  = manage1<left & left<manage2)]

两个警告:

  • 重塑可能是相当昂贵的大型数据集
  • 我(过度)通过忽略idstat

推荐阅读