You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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个关键问题:

  1. 自定义函数逻辑错误:
    • facility_counts函数参数设置为整个ID列表,但实际需要处理单个facility ID
    • 函数内部引用了未定义的变量i,且未显式传入数据源data(依赖全局变量不规范,还可能导致变量找不到)
  2. lapply调用错误:
    • lapply(seq_along(facilities_id_list), function(i) facility_counts)没有给facility_counts传递任何参数,也没通过i获取对应位置的ID值
  3. 语法错误:
    • 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 13:25:12