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

如何为data.table中的数值列添加均值为0、标准差为列均值0.1倍的随机值?

解决data.table数值列添加自定义随机扰动的问题

首先,我注意到你在代码里有几个小问题:一是变量名不统一(用了dat但实际数据是sample),二是lapply的用法有误——你直接传入了rnorm的结果,而不是一个可以对每列单独处理的函数,而且没有针对每一列单独计算均值来设置标准差。

下面是修正后的完整方案,直接针对你的需求实现:

步骤说明

我们需要对每个数值列:

  1. 计算该列的均值
  2. 生成和列长度相同的随机数(均值0,标准差为该列均值的0.1倍)
  3. 将随机数加到原列的每个元素上

完整代码

library(data.table)
# 初始化你的示例数据
sample <- fread("A,0,L,2,2\nB,4,K,3,0")
names(sample) <- c("type", "value1", "cat", "value2", "value3")

# 识别数值列
fetch_cols <- which(sapply(sample, is.numeric))

# 直接在原data.table上修改数值列(推荐,data.table的高效写法)
sample[, (fetch_cols) := lapply(.SD, function(col) {
  # 计算当前列的均值(加na.rm避免缺失值影响)
  col_mean <- mean(col, na.rm = TRUE)
  # 给每个元素添加随机扰动
  col + rnorm(n = length(col), mean = 0, sd = 0.1 * col_mean)
}), .SDcols = fetch_cols]

# 查看结果
sample

代码解释

  • (fetch_cols) :=:这是data.table的更新语法,括号确保我们用变量指定的列名来更新,而不是创建名为fetch_cols的新列
  • .SD代表Subset of Data,结合.SDcols = fetch_cols,我们只对数值列进行操作
  • 每个列单独计算均值,保证标准差是该列自身均值的0.1倍,而不是所有数值列的整体均值
  • rnorm(length(col))生成和列行数相同的随机数,确保每个元素都有对应的扰动值

如果你不想修改原表,而是生成一个新表,可以用下面的写法:

sample_new <- cbind(
  # 保留非数值列
  sample[, !fetch_cols, with = FALSE],
  # 处理数值列
  sample[, lapply(.SD, function(col) {
    col_mean <- mean(col, na.rm = TRUE)
    col + rnorm(length(col), 0, 0.1 * col_mean)
  }), .SDcols = fetch_cols]
)

运行后你会得到类似你期望的输出,比如:

type    value1 cat    value2   value3
1:    A -0.182345   L  1.945678  2.09876
2:    B  4.210987   K  3.123456 -0.04567

(注:随机数每次运行结果不同,这是正常的)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 15:22:48