r - 在 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 个变量:
- m01time & m12time:衡量成为一级经理(manage1)之前经过的年数,然后从manage1到manage2,不管它是否在同一个工作。(以年为单位的数字)
- change:记录他们是否在 manage1 和 manage2 之间经历过工作变动(如果“left”发生在 manage1 和 manage2 之间的某处),(0 或 1)
- & 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 循环类型的作业(例如如何捕获介于两者之间的“左”)我不知道该怎么做.
解决方案
我会以不同于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)]
两个警告:
- 重塑可能是相当昂贵的大型数据集
- 我(过度)通过忽略
id
和stat
推荐阅读
- python - 使用元类而不是工厂模式
- python - 如何根据python函数中的注释来转换参数值?
- java - mockMvc 断言内容为空(内容不是 json)
- asp.net - 如何从asp.net中的url获取用户名值
- sql - 带有过滤器组列的 Postgresql SUM
- excel - 如何修复 excel VBA 中的运行时错误“91”?
- javascript - 如何在反应中将数据从父组件传递到子组件?
- regex - 如何使用 ansible 正则表达式显示第 n 个匹配项
- python-3.x - Paramiko expect 在收到预期输出之前发送命令
- python - 在 Pandas 中分组和计数