使用R模拟含分布与缺失值的600行3000列数据框
R模拟符合要求的矩阵/数据框
以下是完整的实现代码,完全满足你的需求:
# 设置随机种子保证结果可重复 set.seed(123) # 1. 创建空矩阵并设置行名列名 n_rows <- 600 n_cols <- 3000 sim_data <- matrix(nrow = n_rows, ncol = n_cols) rownames(sim_data) <- paste0("id", 1:n_rows) colnames(sim_data) <- paste0("g", 1:n_cols) # 2. 分配正态分布列和右偏分布列的数量(可调整比例) # 随机选择1200-1800列为正态分布,剩余为右偏分布 n_normal <- sample(1200:1800, 1) normal_cols <- sample(1:n_cols, n_normal) skewed_cols <- setdiff(1:n_cols, normal_cols) # 3. 生成正态分布列数据 for (col in normal_cols) { # 随机生成该列的均值(0.11-1.08)和标准差(0.01-0.2) col_mean <- runif(1, min = 0.11, max = 1.08) col_sd <- runif(1, min = 0.01, max = 0.2) sim_data[, col] <- rnorm(n_rows, mean = col_mean, sd = col_sd) } # 4. 生成轻度右偏分布列数据(用Gamma分布,shape=3保证轻度右偏) for (col in skewed_cols) { # 随机生成该列的均值(0.11-1.08) col_mean <- runif(1, min = 0.11, max = 1.08) # 设置shape=3,计算对应的rate使得均值=shape/rate col_shape <- 3 col_rate <- col_shape / col_mean sim_data[, col] <- rgamma(n_rows, shape = col_shape, rate = col_rate) } # 5. 添加缺失值(整体占比30%-40%) missing_pct <- runif(1, min = 0.3, max = 0.4) # 随机选择要设为NA的位置 na_positions <- sample(length(sim_data), size = round(length(sim_data)*missing_pct)) sim_data[na_positions] <- NA # 可选:转成数据框格式 sim_data_df <- as.data.frame(sim_data)
代码解释:
- 随机种子:
set.seed(123)确保每次运行生成的结果一致,方便调试。 - 行名列名:用
paste0批量生成id1-id600和g1-g3000,直接赋值给矩阵的rownames和colnames。 - 分布列分配:通过
sample随机选择正态分布列的数量和具体列,你可以根据需求调整1200:1800的范围来改变两类列的比例。 - 正态分布生成:每列单独随机生成均值和标准差,保证不同列的正态分布参数不同,符合要求。
- 轻度右偏分布:选用Gamma分布,设置
shape=3时分布呈轻度右偏;通过调整rate参数让每列的均值落在0.11-1.08区间内。 - 缺失值添加:先随机确定缺失比例(30%-40%),再通过
sample从矩阵所有元素中随机选择对应数量的位置设为NA,保证整体缺失率符合要求。
内容的提问来源于stack exchange,提问作者Lisa
相关产品推荐
相关产品推荐

