如何使用tidyr通过分组(group-by)计算创建新列?
问题
给定如下R数据框:
name <- c("a", "a", "a", "a", "b", "b", "b", "b") x1 <- c(0, 0, 0, 0, 1, 1, 1, 1) x2 <- c(15, 15, 15, 15, 15, 15, 15, 15) y <- c(1, 2, 1, 2, 1, 2, 1, 2) z <- c(50, 100, 40, 90, 65, 95, 40, 95) df <- data.frame(name, x1, x2, y, z)
需要完成以下操作:
- 按
x1和x2进行分组 - 找出每组中
z的最大值 - 创建新列
z2,将z按该组最大值归一化,预期z2结果为c(0.5, 1, 0.4, 0.9, 0.684, 1, 0.421, 1)
如何使用tidyverse生态工具实现该需求?
解决方案
你需要用到dplyr(属于tidyverse套件,常和tidyr配合使用)来完成分组计算,代码如下:
library(tidyverse) df_processed <- df %>% group_by(x1, x2) %>% mutate( z2 = round(z / max(z), 3) ) %>% ungroup()
代码解释
group_by(x1, x2):指定按x1和x2分组,后续计算会在每组内独立执行mutate(z2 = round(z / max(z), 3)):直接计算每组内z与最大值的比值,并用round()保留3位小数,得到符合预期的归一化结果ungroup():可选步骤,取消分组状态,避免后续操作意外继承分组规则
运行后查看df_processed$z2,结果即为c(0.5, 1, 0.4, 0.9, 0.684, 1, 0.421, 1),与预期一致。
注:tidyr主要负责数据重塑(如宽转长、长转宽),分组聚合类操作核心依赖dplyr,二者同属tidyverse生态,通常搭配使用。
内容的提问来源于stack exchange,提问作者a11
相关产品推荐
相关产品推荐

