如何在R语言面板数据中生成年度阈值跨越标识列
R语言面板数据生成状态切换列的正确写法
先给你修正初始代码里的几个问题,再给出可直接运行的方案:
- 分组逻辑错了:只需要按你的唯一项(别用
unique当列名,这是R内置函数,容易出问题)分组,year是时间维度,不需要放进group_by里。 - 语法问题:列名不能有空格,改成
value_turned这种;case_when的语法是条件 ~ 结果,要拿前一年的数据得用lag()函数。 - 必须先排序:处理时间序列前,一定要确保每个分组内的年份是按顺序排的,不然
lag()取到的不是前一年的值。
完整代码(以原始数值判断为例)
假设你的数据列是unique_id(唯一项)、value(目标数值)、year(年份):
library(dplyr) df <- df %>% # 先按唯一项+年份排序,这步不能省 arrange(unique_id, year) %>% # 按唯一项分组 group_by(unique_id) %>% # 生成目标列 mutate( value_turned = case_when( # 当年数值超10,且前一年没超(第一年默认前一年没超) value > 10 & lag(value, default = 0) <= 10 ~ 1, # 其他所有情况都赋值0 TRUE ~ 0 ) ) %>% # 取消分组(后续操作需要的话可以留着分组) ungroup()
如果已经有value10列(1代表超10,0代表没超)
直接用现成的标记列判断更简单:
df <- df %>% arrange(unique_id, year) %>% group_by(unique_id) %>% mutate( value_turned = case_when( value10 == 1 & lag(value10, default = 0) == 0 ~ 1, TRUE ~ 0 ) ) %>% ungroup()
关键点说明
lag(x, default = 0):取当前行的上一行x的值,default=0是处理每个分组的第一行(没有上一行),默认前一年没超阈值,避免出现NA。arrange是核心前提:如果年份乱序,lag()就会取到错误的行,结果肯定不对。
内容的提问来源于stack exchange,提问作者Kai Du
相关产品推荐
相关产品推荐

