如何在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
相关产品推荐
相关产品推荐

