R语言面板数据中基于多条件生成Enroll_Post_Disp虚拟变量的问题
问题解决:生成虚拟变量并修复slice函数报错
错误原因分析
你遇到的no applicable method for 'slice' applied to an object of class "c('integer', 'numeric')"错误,本质是把slice()函数用在了数值/整数向量上。slice()是dplyr中用于筛选数据框行的工具,只能作用于数据框或tibble对象,不能直接操作向量。
正确实现代码
假设你的数据中有时间变量Quarter(用于判断记录的先后顺序,需替换为你实际的时间列名),以下是生成目标虚拟变量的完整dplyr代码:
library(dplyr) toy_emp <- toy_emp %>% group_by(PersonID) %>% mutate( # 获取每个工人首次裁员的季度(无裁员则为NA) first_layoff_qtr = if (any(PermSeparation == 1)) { min(Quarter[PermSeparation == 1]) } else { NA_real_ }, # 定义两个条件 condition1 = Time_Diff_Layoff_Enroll_Quarters > -3 & Time_Diff_Layoff_Enroll_Quarters < 60, condition2 = WFTFLAG == 1 & !is.na(first_layoff_qtr) & Quarter > first_layoff_qtr, # 生成虚拟变量:满足任一条件为1,否则0 Enroll_Post_Disp = as.integer(condition1 | condition2) ) %>% ungroup()
关键说明
- 条件2的处理:通过
group_by(PersonID)按工人分组,先提取每个工人的首次裁员时间,再判断当前记录是否在裁员之后且WFTFLAG==1。如果工人有多次裁员,可根据需求将min()改为max()(取末次裁员时间)或保留所有裁员时间做判断。 - 避免slice误用:如果之前的代码中存在对向量调用
slice()的情况(比如pull(PermSeparation) %>% slice(which(.==1))),需改为对数据框操作(比如filter(PermSeparation==1) %>% slice(1)),或直接用向量操作函数(如min()、which())替代。 - 无裁员记录的工人:这类工人的
condition2会自动为FALSE,仅通过condition1判断是否赋值为1。
内容的提问来源于stack exchange,提问作者Anna
相关产品推荐
相关产品推荐

