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

