如何在R中创建元素为数组/列表的矩阵?医院排班模拟可行吗?
在R语言中创建存储列表/数组的矩阵模拟医院排班表
当然没问题!在R语言里完全支持创建每个元素为列表(或数组)的矩阵,用来模拟医院排班表存储患者信息完全可行,你的思路(先建初始矩阵再循环填充)也完全走得通。下面给你详细拆解实现步骤:
1. 创建22×7的初始列表矩阵
首先要明确:普通的matrix()函数默认创建的是数值型/字符型等原子向量的矩阵,无法直接存储列表。我们需要先生成一个包含空列表的向量,再将其转换为矩阵:
# 创建22行7列的列表矩阵,初始每个元素为空列表 schedule_matrix <- matrix(vector("list", 22 * 7), nrow = 22, ncol = 7)
你可以验证一下元素类型:
# 检查第一个元素的类型,会返回"list" class(schedule_matrix[[1,1]])
如果需要初始值为0(比如标记无患者的状态),也可以把空列表换成初始值为0的列表:
# 初始每个元素是包含0的列表 schedule_matrix <- matrix(lapply(1:(22*7), function(x) list(0)), nrow=22, ncol=7)
2. 通过循环向矩阵元素添加患者信息
接下来就可以用循环给每个位置的列表添加患者信息了。假设患者信息是结构化的列表(比如包含姓名、年龄、病症等),我们可以用嵌套循环遍历每个排班时段,填充数据:
# 模拟一批患者信息样本 sample_patients <- list( list(name = "张三", age = 35, disease = "上呼吸道感染", note = "需复查"), list(name = "李四", age = 52, disease = "高血压随访"), list(name = "王五", age = 28, disease = "常规体检") ) # 嵌套循环填充排班表(这里随机模拟填充逻辑,你可以替换成实际业务逻辑) set.seed(123) # 固定随机种子,方便复现结果 for (row in 1:nrow(schedule_matrix)) { for (col in 1:ncol(schedule_matrix)) { # 随机决定当前时段的患者数量(0-2人) patient_count <- sample(0:2, 1) if (patient_count > 0) { # 从样本中随机选取对应数量的患者,赋值给当前矩阵位置 schedule_matrix[[row, col]] <- sample(sample_patients, patient_count) } else { # 无患者时可以保留初始值或设为空列表 schedule_matrix[[row, col]] <- list(no_patient = TRUE) } } }
注意:访问列表矩阵的单个元素时,一定要用双括号[[row, col]],而不是单括号[row, col]——单括号返回的是一个子矩阵(仍然是列表矩阵类型),双括号才会直接取出该位置的列表元素。
如果需要给已有患者的时段追加新患者,可以这样写:
# 模拟一个新患者 new_patient <- list(name = "赵六", age = 41, disease = "糖尿病复诊") # 给第5行第3列的时段追加新患者 schedule_matrix[[5, 3]] <- c(schedule_matrix[[5, 3]], list(new_patient))
3. 访问和管理患者信息
填充完成后,你可以轻松查看任意时段的患者信息:
# 查看第3行第2列(假设第2列是周二,第3行是上午第三个时段)的患者 schedule_matrix[[3, 2]] # 提取该时段第一个患者的姓名 schedule_matrix[[3, 2]][[1]]$name # 统计某一列(比如周日,第7列)所有时段的患者总数 sum(sapply(schedule_matrix[,7], function(x) length(x)))
额外小提示
如果你的患者信息结构非常规整(每个患者的字段完全一致),也可以考虑用三维数组来存储(维度为:时段数×星期数×患者字段数),但列表矩阵的灵活性更高——适合处理字段不统一的情况(比如有的患者有特殊备注,有的没有)。
内容的提问来源于stack exchange,提问作者Rita Gonçalves
相关产品推荐
相关产品推荐

