使用case_when构建特定哑变量时代码报错,求解决方法
分组创建哑变量的case_when报错解决
需求说明
按NCLP分组生成哑变量dummy_data,规则如下:
- 若分组内
Data_Fine_Effettiva存在非缺失值,仅该变量最大值对应的观测赋值为1 - 若分组内
Data_Fine_Effettiva全缺失,且Data_Inizio_Effettiva的最大值非缺失且小于阈值my_date,则该最大值对应的观测赋值为1 - 其余情况赋值为0
示例数据

报错代码
df <- df%>% mutate( .by = NCLP, dummy_data = case_when( any(!is.na(Data_Fine_Effettiva)) & Data_Fine_Effettiva == max(Data_Fine_Effettiva, na.rm = TRUE) ~ 1, all(is.na(Data_Fine_Effettiva)) & !is.na(lag(Data_Inizio_Effettiva)) & Data_Inizio_Effettiva == max(Data_Inizio_Effettiva) & Data_Inizio_Effettiva < my_date ~ 1, .default=0)) %>%
错误信息(翻译后)
Error in `mutate_cols()`: ! `mutate()`创建列`dummy_data`时出现问题。 i `dummy_data = case_when(...)`. x 第3个条件(`any(!is.na(Data_Fine_Effettiva)) & Data_Fine_Effettiva == max(Data_Fine_Effettiva, na...`)必须是双向公式,不能是双精度向量。 由`abort_case_when_formula()`引发的错误: ! 第3个条件(`any(!is.na(Data_Fine_Effettiva)) & Data_Fine_Effettiva == max(Data_Fine_Effettiva, na...`)必须是双向公式,不能是双精度向量。
解决方法及修正代码
错误原因
- 第二个条件中
max(Data_Inizio_Effettiva)未添加na.rm=TRUE,分组内存在缺失值时会返回NA,导致条件逻辑向量出现无效值,触发dplyr语法检查报错 lag(Data_Inizio_Effettiva)疑似笔误,不符合需求中“取Data_Inizio_Effettiva最大值”的描述- 代码末尾多余的
%>%属于语法不规范,需移除
修正后代码
# 先确保my_date为日期格式,示例:my_date <- as.Date("2023-01-01") df <- df %>% mutate( .by = NCLP, dummy_data = case_when( # 规则1:Data_Fine_Effettiva存在非缺失值时,最大值对应行赋值1 any(!is.na(Data_Fine_Effettiva)) & Data_Fine_Effettiva == max(Data_Fine_Effettiva, na.rm = TRUE) ~ 1, # 规则2:Data_Fine_Effettiva全缺失时,Data_Inizio_Effettiva最大值非缺失且小于my_date,对应行赋值1 all(is.na(Data_Fine_Effettiva)) & !is.na(max(Data_Inizio_Effettiva, na.rm = TRUE)) & Data_Inizio_Effettiva == max(Data_Inizio_Effettiva, na.rm = TRUE) & Data_Inizio_Effettiva < my_date ~ 1, # 其余情况赋值0 .default = 0 ) )
内容的提问来源于stack exchange,提问作者Andrea Stringhetti
相关产品推荐
相关产品推荐

