分组Z分数计算是否会改变数据顺序?基于R语言dplyr实现场景
分组计算Z分数时是否会改变数据顺序?
放心,分组计算Z分数不会改变原始数据的行顺序!咱们用你给出的iris数据集代码来实际验证一下,就能彻底搞清楚。
首先先回顾你的处理代码:
library(dplyr) library(tidyr) dat = iris %>% gather(variable, value, -Species) %>% group_by(Species, variable) %>% mutate(z_score_group = (value - mean(value)) / sd(value)) %>% ungroup %>% mutate(z_score_ungrouped = (value - mean(value)) / sd(value))
验证顺序一致性
我们可以直接对比分组处理前后的原始数据行顺序:
# 生成gather后的原始数据(未添加Z分数列)作为参考 original_data <- iris %>% gather(variable, value, -Species) # 对比dat去掉Z分数列后和原始数据是否完全一致(包括行顺序) identical(dat %>% select(-z_score_group, -z_score_ungrouped), original_data)
运行这段代码会返回TRUE,这就说明分组计算后,数据的行排列顺序和gather后的原始数据完全没有变化。
为什么不会改变顺序?
dplyr中的group_by()只是给数据添加分组标记,后续的mutate()操作仅会在每个分组内计算新列的值,不会对行的位置进行调整。只有当你主动使用arrange()这类排序函数时,才会改变数据的顺序,单纯的分组计算不会影响行的原有排列。
另外补充一点:你之前验证未分组Z分数顺序的逻辑,套用到分组Z分数上时要注意:identical(order(dat$z_score_group), order(dat$value))可能会返回FALSE,但这不是因为行顺序变了——而是因为分组标准化后,不同组的Z分数数值排序和原始value的整体排序不一致,但每一行的位置还是和原始数据完全对应的。
内容的提问来源于stack exchange,提问作者MrNetherlands
相关产品推荐
相关产品推荐

