You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 03:35:30