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

如何在R语言中基于其他列创建分组列/变量

用case_when()创建分组变量的解决方案

首先构造一份可测试的示例数据框,模拟你的数据场景:

library(dplyr)

df <- tibble(
  V1 = c(1, NA, NA, 4, 5),
  V2 = c(2, NA, NA, 8, NA),
  V3 = c(NA, 3, NA, NA, 10),
  V4 = c(NA, 6, NA, NA, 20),
  V5 = c(NA, NA, 7, 14, NA),
  V6 = c(NA, NA, 14, 28, NA)
)

基础实现(每行匹配单个分组)

如果你的数据中每行只会满足一个分组条件,直接用case_when()结合!is.na()判断非缺失值即可:

df <- df %>%
  mutate(Group = case_when(
    # V1和V2均有数据 → G1
    !is.na(V1) & !is.na(V2) ~ "G1",
    # V3和V4均有数据 → G2
    !is.na(V3) & !is.na(V4) ~ "G2",
    # V5和V6均有数据 → G3
    !is.na(V5) & !is.na(V6) ~ "G3",
    # 不满足任何条件的行返回NA
    TRUE ~ NA_character_
  ))

case_when()会按顺序匹配第一个满足的条件,所以如果某行同时符合多个分组(比如V1/V2和V3/V4都有数据),会优先返回排在前面的分组(这里是G1)。

处理多分组匹配的情况

如果存在一行同时满足多个分组条件,需要返回所有匹配的组,可以用字符串拼接的方式实现:

library(stringr)

df <- df %>%
  mutate(
    Group = str_c(
      ifelse(!is.na(V1) & !is.na(V2), "G1", ""),
      ifelse(!is.na(V3) & !is.na(V4), ",G2", ""),
      ifelse(!is.na(V5) & !is.na(V6), ",G3", ""),
      sep = ""
    ) %>%
      str_remove("^,") %>% # 去掉开头多余的逗号
      na_if("") # 空字符串转为NA
  )

常见失败原因排查

你之前用case_when()失败,大概率是这几个原因:

  • 没正确用!is.na()判断缺失值,直接用V1 != NA(R中NA不能用==或!=判断)
  • 条件顺序错误,导致后面的分组被前面的条件提前匹配覆盖
  • 没设置TRUE ~ ...的兜底逻辑,未匹配的行会返回NULL而非预期的NA

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 05:12:33