使用dplyr::group_by新增计数分组列时遇组大小错误求助
问题分析与解决方案
你的代码结果不符合预期,核心原因是分组后的seq(unique(Mean))逻辑不匹配需求:
当你用group_by(Mean)后,每个分组内的Mean值都是单一且唯一的(分组依据就是Mean),所以unique(Mean)在每个分组里只会返回1个元素,seq(unique(Mean))等价于生成只包含1的序列,最终每个组的AVGMOrder都会被设为1,这显然不是你想要的「对48个唯一分组全局计数」的效果。
下面是几种能实现你需求的正确写法:
方法1:用cur_group_id()直接获取分组序号
dplyr的cur_group_id()函数会返回当前分组在所有分组中的全局序号,正好匹配你的需求:
xist.df %>% group_by(Mean) %>% mutate(AVGMOrder = cur_group_id())
这个方法会按分组的默认顺序(数据中首次出现的顺序)给每个唯一Mean分配1到48的序号,每个Mean对应的所有行都会拥有相同的AVGMOrder值。
方法2:基于自定义排序生成序号
如果你需要按Mean的数值大小(或其他规则)排序后再分配序号,可以用因子转换的方式:
xist.df %>% mutate(AVGMOrder = as.numeric(factor(Mean, levels = unique(sort(Mean)))))
这里sort(Mean)会先对Mean值排序,unique()确保每个值只出现一次,转成因子后用as.numeric()就能得到排序后的序号,这个方法不需要分组,直接全局处理。
方法3:创建映射表后左连接
如果你需要更灵活的控制(比如后续要修改序号规则),可以先生成唯一Mean的序号映射表,再和原数据连接:
# 生成唯一Mean的序号映射 mean_order_map <- xist.df %>% distinct(Mean) %>% mutate(AVGMOrder = row_number()) # 左连接回原数据 xist.df %>% left_join(mean_order_map, by = "Mean")
这种方式的优势是可以单独调整映射表的排序或序号规则,再应用到原数据上。
内容的提问来源于stack exchange,提问作者Alex Nesta
相关产品推荐
相关产品推荐

