R语言lapply、rbind与do.call组合语句格式问题排查
lapply、rbind与do.call组合代码的错误分析与修正
测试数据
先构造标准的R数据框格式测试数据:
data <- data.frame( facility_id = c(123, 123, 25, 25, 25, 65, 22, 22), patient_number = c(1000, 1000, 1001, 1002, 1010, 1009, 1222, 1223), test_result = c(25, 30, 12, 67, 75, 8, 95, 89) )
原始文本形式的测试数据:
facility_id patient_number test_result 123 1000 25 123 1000 30 25 1001 12 25 1002 67 25 1010 75 65 1009 8 22 1222 95 22 1223 89
原代码的核心错误
你的代码存在3个关键问题:
- 自定义函数逻辑错误:
facility_counts函数参数设置为整个ID列表,但实际需要处理单个facility ID- 函数内部引用了未定义的变量
i,且未显式传入数据源data(依赖全局变量不规范,还可能导致变量找不到)
- lapply调用错误:
lapply(seq_along(facilities_id_list), function(i) facility_counts)没有给facility_counts传递任何参数,也没通过i获取对应位置的ID值
- 语法错误:
do.call语句末尾缺少闭合括号,代码无法正常解析
修正后的代码
方案1:保留自定义函数(匹配你的学习需求)
facilities_id_list <- c(123, 25) # 修正自定义函数:接收单个目标ID和数据源 facility_subset <- function(target_id, data_source) { subset(data_source, facility_id == target_id) } # 正确组合lapply、do.call和rbind results <- do.call("rbind", lapply(facilities_id_list, function(id) facility_subset(id, data))) # 查看结果 print(results)
方案2:简化写法(无需自定义函数,供参考)
如果不需要自定义函数,可直接在lapply中写筛选逻辑:
results <- do.call("rbind", lapply(facilities_id_list, function(id) data[data$facility_id == id, ]))
运行结果
修正后代码会输出你期望的结果:
facility_id patient_number test_result 1 123 1000 25 2 123 1000 30 3 25 1001 12 4 25 1002 67 5 25 1010 75
内容的提问来源于stack exchange,提问作者bziggy
相关产品推荐
相关产品推荐

