You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)

代码关键说明

  1. 拆分字符串:str_split(CHILD_CRAFT_LIST, ",")会把每个单元格的逗号分隔字符串拆分成工种向量(比如"MAINT,SOHC,MAINT"会变成c("MAINT", "SOHC", "MAINT"))。
  2. 批量逻辑判断:map_lgl()会遍历每个拆分后的向量,用all(.x %in% craft)判断该向量的所有元素是否都在craft里,返回布尔值列。
  3. 简化条件逻辑:先把“是否需要触发维修类型判断”提取成单独的辅助列,让case_when的条件更清晰易懂。
  4. 规范NA值:用NA_character_明确返回字符型NA,避免类型不一致的问题。

运行这段代码后,你会得到和预期完全一致的结果:

WONUMCHILD_CRAFT_LISTis_there_water_damagerepair_required_for_this_apartmentREPAIR_TYPE
1MAINT,MAINTYSimple
2MAINT,SOHC,MAINTYComplex
3MAINT,PAINTER,MAINTYYComplex
4MAINT,SOHC,PLUMBERYComplex
5MAINTNA

内容的提问来源于stack exchange,提问作者ccwiris

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 06:48:21