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

如何用R的dplyr::mutate合并两列分组并修正case_when逻辑错误

问题:合并分组数据时case_when规则错误导致结果不符合预期

数据背景

因数据录入问题,需将两列相似分组数据合并为一列,将原3组+NA的结构简化为2组+NA。给定数据示例如下:

x <- data.frame(
  a= c("Group 1", "Group 2", "Group 1", NA, "Group 1",NA, "Group 3", "Group 3"),
  b= c("Group 1", NA, NA, "Group 2", "Group 1", NA, NA, "Group 3")
)
x

期望的分组映射规则

  • Group 1 + Group 1 = Group 1
  • Group 2 + NA = Group 2
  • Group 1 + NA = Group 1
  • NA + NA = NA
  • Group 3 + NA = Group 1
  • Group 3 + Group 3 = Unknown

错误代码及异常结果

使用以下case_when代码处理时出现错误:

x |> 
  dplyr::mutate(Group = case_when(a == c("Group 1")|b == c("Group 1") ~ "Group 1",
                                  a == c("Group 2")|b == c("NA") ~ "Group 2",
                                  a == c("Group 1")|b == c("NA") ~ "Group 2",
                                  a == c("NA")|b == c("NA") ~ NA,
                                  a == c("Group 3")|b == c("NA") ~ "Group 1",
                                  a == c("Group 3")|b == c("Group 3") ~ "Unknown",
  ))

运行后结果不符合预期:Group 3 + Group 3被错误归类为Group1,Group3+NA被归为Unknown

问题分析与修正方案

错误原因

  1. NA匹配方式错误:代码中用b == "NA"是匹配字符串"NA",而非R中的缺失值NA,正确判断缺失值应使用is.na()函数。
  2. 规则顺序错误:case_when按从上到下顺序匹配规则,一旦满足前置规则就返回结果,不会再检查后续规则。原代码中部分规则顺序颠倒,导致特殊情况被错误匹配。
  3. 规则逻辑错误:第三条规则a == "Group 1"|b == "NA" ~ "Group 2"完全违背需求,Group1+NA应映射为Group1而非Group2。
  4. 冗余语法:a == c("Group 1")中的c()属于冗余写法,直接使用a == "Group 1"即可。

修正后的代码

library(dplyr)

x |> 
  mutate(Group = case_when(
    # 优先匹配特殊规则:Group3+Group3
    a == "Group 3" & b == "Group 3" ~ "Unknown",
    # 匹配所有应归为Group1的情况
    (a == "Group 1" | b == "Group 1") | (a == "Group 3" & is.na(b)) ~ "Group 1",
    # 匹配Group2+NA的情况
    a == "Group 2" & is.na(b) ~ "Group 2",
    # 匹配NA+NA的情况
    is.na(a) & is.na(b) ~ NA_character_,
    # 处理未覆盖的边缘情况(如NA+Group2),可根据实际需求调整
    TRUE ~ NA_character_
  ))

验证结果

运行修正后的代码,得到符合预期的结果:

a        b    Group
1 Group 1 Group 1 Group 1
2 Group 2     NA Group 2
3 Group 1     NA Group 1
4    NA Group 2    <NA>
5 Group 1 Group 1 Group 1
6    NA     NA    <NA>
7 Group 3     NA Group 1
8 Group 3 Group 3  Unknown

额外说明

若需覆盖更多组合(如原数据中第4行的NA+Group2),可在Group2的规则中补充逻辑,例如:

(a == "Group 2" & is.na(b)) | (is.na(a) & b == "Group 2") ~ "Group 2"

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 16:18:29