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

在R数据框中基于现有参数列添加正态分布数据列报错求助

解决R中生成列表列的长度不匹配错误

问题根源

  • 使用sapply(df, ...)遍历的是数据框的列(共6列),最终生成6个元素的结果,但数据框仅有3行,赋值时长度不匹配导致报错。
  • 直接调用rnorm(df$n1, df$m1, df$sd1)会一次性生成所有行n1对应的样本总数(5+10+20=35个),而非为每行单独生成对应数量的样本。

修正代码

要为每行生成包含n1 + n2个正态分布样本的列表列,需按行处理数据,以下两种方法均可实现:

方法1:基础R的apply函数

df <- data.frame(n1 = c(5, 10, 20), 
                 n2 = c(10, 10, 20), 
                 m1 = c(0.01, 1.2, 1.1), 
                 m2 = c(0.1,0.2,0.5), 
                 sd1 = c(1,1,1), 
                 sd2 = c(2,1,2))

df$val <- apply(df, 1, function(row) {
  # 提取当前行的参数(转换为数值类型)
  n1 <- as.numeric(row["n1"])
  m1 <- as.numeric(row["m1"])
  sd1 <- as.numeric(row["sd1"])
  n2 <- as.numeric(row["n2"])
  m2 <- as.numeric(row["m2"])
  sd2 <- as.numeric(row["sd2"])
  
  # 生成并合并两组正态样本
  c(rnorm(n1, m1, sd1), rnorm(n2, m2, sd2))
})

方法2:purrr包的pmap函数(更简洁)

如果习惯使用tidyverse工具,可以用pmap按行映射参数:

library(purrr)

df$val <- pmap(df, function(n1, n2, m1, m2, sd1, sd2) {
  c(rnorm(n1, m1, sd1), rnorm(n2, m2, sd2))
})

结果验证

运行后,df$val的每个元素都是对应行的样本列表:

# 检查第一行样本数量(5+10=15)
length(df$val[[1]])
# 输出:15

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 17:02:26