R语言基于条件生成Repair_Type新列的代码修正求助
修正代码实现REPAIR_TYPE列的生成
你遇到的核心问题是:CHILD_CRAFT_LIST是逗号分隔的字符串,而非向量,直接对它使用all()或any()函数会把整个字符串当作单个元素去和craft列表对比,这显然不符合你的需求——我们需要先把每个字符串拆分成独立的工种向量,再判断这些工种是否都在目标列表里。
修正后的完整代码
我们需要结合tidyr::str_split()拆分字符串,用purrr::map_lgl()对每个拆分后的向量做逻辑判断,再配合dplyr的函数完成计算:
library(dplyr) library(tidyr) library(purrr) # 定义目标工种列表 craft <- c("CARETAKE","MAINT","CHIEFCTK") # 处理数据表(注意:避免用table作为变量名,它是R内置函数) your_table %>% mutate( # 辅助列1:判断当前行的所有工种是否都在craft列表中 all_craft_valid = map_lgl(str_split(CHILD_CRAFT_LIST, ","), ~all(.x %in% craft)), # 辅助列2:判断是否满足维修触发条件 repair_triggered = is_there_water_damage == 'Y' | repair_required_for_this_apartment == 'Y', # 生成REPAIR_TYPE列 REPAIR_TYPE = case_when( repair_triggered & all_craft_valid ~ 'Simple', repair_triggered & !all_craft_valid ~ 'Complex', TRUE ~ NA_character_ ) ) %>% # 可选:删除临时辅助列 select(-all_craft_valid, -repair_triggered)
代码关键说明
- 拆分字符串:
str_split(CHILD_CRAFT_LIST, ",")会把每个单元格的逗号分隔字符串拆分成工种向量(比如"MAINT,SOHC,MAINT"会变成c("MAINT", "SOHC", "MAINT"))。 - 批量逻辑判断:
map_lgl()会遍历每个拆分后的向量,用all(.x %in% craft)判断该向量的所有元素是否都在craft里,返回布尔值列。 - 简化条件逻辑:先把“是否需要触发维修类型判断”提取成单独的辅助列,让
case_when的条件更清晰易懂。 - 规范NA值:用
NA_character_明确返回字符型NA,避免类型不一致的问题。
运行这段代码后,你会得到和预期完全一致的结果:
| WONUM | CHILD_CRAFT_LIST | is_there_water_damage | repair_required_for_this_apartment | REPAIR_TYPE |
|---|---|---|---|---|
| 1 | MAINT,MAINT | Y | Simple | |
| 2 | MAINT,SOHC,MAINT | Y | Complex | |
| 3 | MAINT,PAINTER,MAINT | Y | Y | Complex |
| 4 | MAINT,SOHC,PLUMBER | Y | Complex | |
| 5 | MAINT | NA |
内容的提问来源于stack exchange,提问作者ccwiris
相关产品推荐
相关产品推荐

