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

使用scale()函数标准化data.frame中所有数值列(保留日期)

对DataFrame标准化并保留日期列的实现方法

完全可以实现这个需求——只对数据框里的数值型列做标准化处理,日期列和其他非数值列保持原样即可。下面用你提供的示例数据演示两种常用实现方式:

示例数据

dat <- structure(list(date = c("2021-01-01", "2021-01-02", "2021-01-03", 
"2021-01-04", "2021-01-05", "2021-01-06"), launches = c(4, 0, 
0, 0, 8, 4), pledged = c(50278.64, 0, 0, 0, 366279.590415302, 
172073.0471292), backers = c(2880, 0, 0, 0, 6588, 3528), total_goal = c(24000, 
0, 0, 0, 148000, 60000), mean_goal = c(6000, 0, 0, 0, 18500, 
15000), US = c(4, 0, 0, 0, 4, 0), `number of success` = c(4, 
0, 0, 0, 8, 4), duration_days = c(30, 0, 0, 0, 31, 30), Twitter = c(1324L, 
1548L, 1297L, 1585L, 1636L, 1583L), replies = c(882L, 1252L, 
910L, 1018L, 810L, 1000L), likes = c(22859L, 24375L, 17854L, 
20341L, 19521L, 19401L), retweets = c(8621L, 8239L, 6141L, 6728L, 
6938L, 6842L), group_date = c("01", "01", "01", "01", "01", "01"
)), row.names = c(NA, 6L), class = "data.frame")

方法一:Base R 实现

核心是先筛选数值列,单独做标准化,再和非数值列合并:

# 筛选出数值型列的索引
num_cols <- sapply(dat, is.numeric)

# 对数值列做z-score标准化,处理标准差为0的情况(避免生成NaN)
normalized_num <- lapply(dat[num_cols], function(x) {
  if (sd(x) != 0) {
    (x - mean(x)) / sd(x)
  } else {
    x  # 标准差为0时保留原数值
  }
})

# 合并非数值列(日期等)和标准化后的数值列
dat_normalized <- cbind(dat[!num_cols], as.data.frame(normalized_num))

方法二:tidyverse(dplyr)实现

用across函数批量处理数值列,代码更简洁:

library(dplyr)

dat_normalized <- dat %>%
  mutate(across(where(is.numeric), ~ifelse(sd(.) != 0, (. - mean(.))/sd(.), .)))

说明

  • 两种方法都会自动保留date、group_date这类非数值列,仅对数值型列做标准化;
  • 加入了标准差为0的判断,避免全0列或常量列在标准化时出现NaN的问题;
  • 这里用的是最常用的z-score标准化((x-均值)/标准差),如果需要其他标准化方式(比如min-max归一化),替换对应的公式即可。

内容的提问来源于stack exchange,提问作者Daworn

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 13:33:05