如何在dplyr分组时为每个NA值分配独立分组ID?
解决dplyr分组时NA值独立编号的问题
原代码通过group_by(id_mother)结合cur_group_id()生成分组ID,但当id_mother包含NA时,所有NA会被归为同一组。要实现每个NA对应独立的Family编号,可以用以下两种方法:
方法一:生成唯一临时分组键
给每个NA值生成唯一的临时标识,让group_by将它们视为独立分组,最后删除临时列即可:
datanew <- df_bsp %>% mutate( temp_id = ifelse(is.na(id_mother), paste0("NA_", row_number()), id_mother) ) %>% group_by(temp_id) %>% mutate(Family = cur_group_id()) %>% ungroup() %>% select(-temp_id)
核心思路:用row_number()给每个NA生成唯一后缀,确保每个NA的temp_id不重复,分组后每个NA会得到独立的cur_group_id()。
方法二:先分组非NA再补全NA编号
先给非NA值正常分组,再给每个NA分配递增的新编号:
datanew <- df_bsp %>% group_by(id_mother) %>% mutate(Family = cur_group_id()) %>% ungroup() %>% mutate( # 处理全NA的边界情况,默认最大分组ID为0 max_family = ifelse(all(is.na(Family)), 0, max(Family, na.rm = TRUE)), # 用cumsum给每个NA依次分配后续编号 Family = ifelse( is.na(id_mother), max_family + cumsum(is.na(id_mother)), Family ) ) %>% select(-max_family)
核心思路:先通过常规分组得到非NA的分组ID,再用cumsum(is.na(id_mother))统计当前行及之前的NA累计数量,加上最大非NA分组ID,得到每个NA的唯一编号。
内容的提问来源于stack exchange,提问作者Max Herre
相关产品推荐
相关产品推荐

