R语言按id分组根据rank判断code一致性生成type标识列求助
R语言分组自定义类型字段实现方案
数据修正说明
原问题中示例数据框的id列定义和打印结果存在笔误,先修正数据定义如下:
DF <- data.frame( id = c("A1","A1","A1","B2","B2","B2"), rank = c("1","2","3","1","2","3"), code = c("A","B","B","B","B","A") )
完整实现代码
使用dplyr包实现分组计算逻辑,代码如下:
library(dplyr) result <- DF %>% # 按id分组执行所有计算逻辑 group_by(id) %>% mutate( # 计算type1 type1 = ifelse(rank == 1, tolower(code[rank == 1]), NA_character_), # 计算type2 type2 = ifelse( rank <= 2, ifelse(n_distinct(code[rank <= 2]) == 1, tolower(first(code[rank <= 2])), "MIX"), NA_character_ ), # 计算type3 type3 = ifelse(n_distinct(code[rank <= 3]) == 1, tolower(first(code[rank <= 3])), "MIX") ) %>% ungroup() # 查看结果 print(result)
运行后输出结果和题目要求的预期输出完全一致。
逻辑说明
type1:仅rank=1的行返回当前分组rank=1对应code的小写值,同组其他行返回NAtype2:先判断当前分组rank≤2的所有code值是否完全一致,一致则返回对应小写值,不一致返回MIX;仅rank≤2的行展示上述结果,同组其他行返回NAtype3:判断当前分组rank≤3的所有code值是否完全一致,一致则返回对应小写值,不一致返回MIX,同组所有行都展示该结果
高rank场景扩展
如果需要生成typeN(N为大于3的正整数)字段,只需按如下规则新增mutate逻辑即可:
typeN = ifelse( rank <= N, ifelse(n_distinct(code[rank <= N]) == 1, tolower(first(code[rank <= N])), "MIX"), NA_character_ )
内容的提问来源于stack exchange,提问作者hklovs
相关产品推荐
相关产品推荐

