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

如何在R中按组使用scale()函数获取标准化数据?

R中按组自动完成标准化的高效方法

你需要按variety列分组,对KN和GY列批量执行scale()标准化,替代手动逐个提取分组处理的低效操作,以下是两种常用的自动化实现方案:

示例数据集

dataA=structure(list(variety = c("CV1", "CV1", "CV4"), KN = c(3150, 2646, 3760), GY = c(9729.7744491255, 8562.20151523044, 14517.4412415523)), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, -3L))

方案一:使用dplyr(tidyverse生态)

适合习惯tidy语法的场景,代码简洁易读:

# 加载dplyr包
library(dplyr)

# 方法1:逐个指定列生成标准化列
dataA_scaled <- dataA %>%
  group_by(variety) %>%
  mutate(
    KN_scaled = scale(KN), # scale()默认参数为center=TRUE, scale=TRUE,和手动设置一致
    GY_scaled = scale(GY)
  ) %>%
  ungroup() # 按需取消分组状态,不影响后续操作可省略

# 方法2:用across()批量处理多列(更适合列数较多的场景)
dataA_scaled <- dataA %>%
  group_by(variety) %>%
  mutate(across(c(KN, GY), ~scale(.x), .names = "{.col}_scaled")) %>%
  ungroup()

across()会自动遍历指定列,.names参数按规则生成新列名(比如KN对应KN_scaled),无需重复写scale逻辑。


方案二:使用data.table(适合大数据集)

如果你的数据量较大,data.table的分组处理效率更高,且支持原地修改数据:

# 加载data.table包
library(data.table)

# 转换为data.table对象
setDT(dataA)

# 按variety分组,原地添加标准化列
dataA[, c("KN_scaled", "GY_scaled") := .(scale(KN), scale(GY)), by = variety]

# 若不想修改原数据,可先复制再操作
dataA_scaled <- copy(dataA)
dataA_scaled[, c("KN_scaled", "GY_scaled") := .(scale(KN), scale(GY)), by = variety]

by = variety指定分组依据,:=是data.table的高效赋值运算符,直接在数据中添加新列。


两种方法均可自动遍历所有variety分组完成标准化,不管有多少个品种都能一键处理,彻底解决手动操作的低效问题。

内容的提问来源于stack exchange,提问作者J.K Kim

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 03:48:11