如何在R中为N组T时段生成每组-时段随机行数的矩阵
生成含随机行数的组-时间周期矩阵
需求说明
需要创建一个包含N个组、T个时间周期的矩阵,每个组-时间周期组合对应随机行数,行数由round(runif(1,2,4))生成(即随机取2、3、4中的一个整数)。
输入示例
set.seed(123) ngroup = 2 tperiod = 2
执行后,4次调用round(runif(1,2,4))得到的结果为3、4、3、4,对应以下要求:
- 组1时间1有3行
- 组1时间2有4行
- 组2时间1有3行
- 组2时间2有4行
输出示例
最终矩阵第一列为组ID,第二列为时间ID,示例如下:
mat = cbind(c(1,1,1,1,1,1,1,2,2,2,2,2,2,2), c(1,1,1,2,2,2,2,1,1,1,2,2,2,2)) mat [,1] [,2] [1,] 1 1 [2,] 1 1 [3,] 1 1 [4,] 1 2 [5,] 1 2 [6,] 1 2 [7,] 1 2 [8,] 2 1 [9,] 2 1 [10,] 2 1 [11,] 2 2 [12,] 2 2 [13,] 2 2 [14,] 2 2
实现代码
以下是通用的R代码实现,可适配任意N和T的值:
set.seed(123) ngroup <- 2 tperiod <- 2 # 生成所有组-时间的组合 group_time_pairs <- expand.grid(group = 1:ngroup, time = 1:tperiod) # 为每个组合生成随机行数(2-4之间的整数) row_numbers <- sapply(1:nrow(group_time_pairs), function(x) round(runif(1, 2, 4))) # 根据行数重复每个组-时间组合 data_list <- mapply(function(g, t, n) data.frame(group = rep(g, n), time = rep(t, n)), group_time_pairs$group, group_time_pairs$time, row_numbers, SIMPLIFY = FALSE) # 合并数据并转为矩阵 result_mat <- do.call(rbind, data_list) |> as.matrix() # 打印结果 result_mat
代码说明
- 生成组合:用
expand.grid生成所有组与时间的笛卡尔积,确保每个组-时间组合都被覆盖。 - 生成随机行数:通过
sapply循环为每个组合生成指定范围的随机行数。 - 重复组合:用
mapply对每个组-时间组合,按生成的行数重复对应的ID,生成子数据框。 - 合并转矩阵:将所有子数据框合并后转为矩阵,得到符合要求的结果。
内容的提问来源于stack exchange,提问作者yacx
相关产品推荐
相关产品推荐

