for循环中筛选分组数据求和异常的问题排查与解决
修正按Batch分组检查RelAb和的for循环代码
需求:编写for循环,按Batch分组检查观测值的相对丰度(RelAb)之和是否为100。手动逐个检查每个Batch时,RelAb的和均为100,但编写for循环后,每次输出结果都是1100(Batches向量长度为11),需要修正循环代码。
示例数据:
| Batch | Reads | RelAb |
|---|---|---|
| A1 | 28431 | 72.94 |
| A1 | 10549 | 27.06 |
| B1 | 19315 | 85.96 |
| B1 | 3155 | 14.04 |
错误原因
两段错误代码的核心问题是:循环中没有使用当前迭代的变量i,而是每次过滤/子集化所有的Batch值,导致每次计算的是所有11个Batch的RelAb总和(11*100=1100),而不是单个Batch的和。
修正后的代码
1. dplyr::filter版本
Batches <- c("A1", "A2", "A3", "A4", "B1", "B2", "B3", "B4", "B5", "B6", "B7") for(i in Batches) { filtered.batch <- data.batch %>% dplyr::filter(Batch == i) # 仅筛选当前迭代的Batch print(sum(filtered.batch$RelAb)) }
2. 基础R子集化版本
Batches <- c("A1", "A2", "A3", "A4", "B1", "B2", "B3", "B4", "B5", "B6", "B7") for(i in Batches) { # 修正子集逻辑:筛选当前Batch的RelAb列 filtered.batch <- data.batch[data.batch$Batch == i, "RelAb"] print(sum(filtered.batch)) }
更高效的替代方案(无需for循环)
如果不需要逐个打印,直接用dplyr分组计算更简洁:
library(dplyr) data.batch %>% group_by(Batch) %>% summarise(RelAb_sum = sum(RelAb), .groups = "drop")
这段代码会直接输出每个Batch对应的RelAb总和,无需手动循环。
内容的提问来源于stack exchange,提问作者Darren
相关产品推荐
相关产品推荐

