【问题标题】:Specify multiple conditions in long form data in R在 R 中以长格式数据指定多个条件
【发布时间】:2021-03-17 11:45:55
【问题描述】:

如何根据规范索引我需要的行?

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 或 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 循环类型的作业(例如如何捕获介于两者之间的“左”)与。

【问题讨论】:

    标签: r dplyr data.table


    【解决方案1】:

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

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

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

    其他变量以宽数据格式更方便地计算:

    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 的重复项(过度)简化了您的虚拟数据

    【讨论】:

      猜你喜欢
      • 2017-08-10
      • 2014-06-07
      • 2018-06-03
      • 1970-01-01
      • 2021-12-28
      • 2020-07-24
      • 2015-04-01
      • 2017-03-19
      • 1970-01-01
      相关资源
      最近更新 更多