如何在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
相关产品推荐
相关产品推荐

