如何在R语言DataFrame中按分组规则生成分类列?
按分组生成category列的R语言实现
原始数据
group1 <- c('A','A','A','A', 'B','B','B','B', 'C','C','C','C') group2 <- c(1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4) indicator <- c(1, 1, 1, 1, 1, 1, NA, 1, NA, 1, 1, NA) df <- data.frame(group1, group2, indicator)
需求说明
按group1分组,对每组内的indicator值生成新列category,规则如下:
- 分组内第一个1标记为"New"
- NA之后的第一个1标记为"Return"
- 其余所有1标记为"Normal"
- 所有NA标记为"None"
实现代码
可以用dplyr结合行内逻辑判断实现,代码如下:
library(dplyr) df_result <- df %>% group_by(group1) %>% mutate( # 先标记NA的情况 category = case_when( is.na(indicator) ~ "None", TRUE ~ NA_character_ ), # 标记所有"新段落"的第一个1:包括分组开头的第一个1、NA之后的第一个1 flag = cumsum(!is.na(indicator)) != lag(cumsum(!is.na(indicator)), default = 0) & indicator == 1 ) %>% mutate( category = case_when( is.na(indicator) ~ "None", flag & row_number() == which(indicator == 1)[1] ~ "New", flag & row_number() != which(indicator == 1)[1] ~ "Return", indicator == 1 ~ "Normal" ) ) %>% select(-flag) %>% # 移除辅助列 ungroup() print(df_result)
代码逻辑解释
- 按
group1分组后,先通过case_when把所有NA值标记为"None" - 生成辅助列
flag:用cumsum(!is.na(indicator))统计非NA值的累计次数,当累计次数发生变化且当前值为1时,说明这是一段连续非NA中的第一个1(覆盖分组开头的第一个1、NA之后的第一个1两种场景) - 再次用
case_when细化标记:- 保留NA的"None"标记
flag为TRUE且是分组内第一个1的,标记为"New"- 其他
flag为TRUE的1,标记为"Return" - 剩余的1统一标记为"Normal"
- 最后移除辅助列并取消分组
运行代码后即可得到期望的结果。
内容的提问来源于stack exchange,提问作者user2813606
相关产品推荐
相关产品推荐

