R语言如何用for循环基于日增长率迭代计算多列细胞数
R实现基于日增长率迭代计算每日细胞计数
前置注意事项
- 输入的增长率表
df1中增长率、日期列默认是字符型,必须先转换为数值类型才能进行算术运算 - 计算前需要对增长率表按
Day字段升序排序,避免日期顺序错乱导致迭代结果错误 - 你给出的预期结果中B列第60天的
18000为笔误,按照公式1200*(1+0.5)计算正确结果应为1800,其余列结果与示例完全匹配
方法1:for循环实现(严格匹配迭代逻辑)
# 读入示例数据 df1 <- data.frame(Day = c('59','60' ), A= c('.1', '.6'), B= c('.2', '.5'), C=c('.3','.4')) # 1. 数据类型转换 df1$Day <- as.numeric(df1$Day) # 定义物种列名,后续如果新增物种直接修改这个向量即可 species_cols <- c("A", "B", "C") df1[species_cols] <- lapply(df1[species_cols], function(x) as.numeric(as.character(x))) # 2. 按日期升序排序,保证迭代顺序正确 df1 <- df1[order(df1$Day), ] # 3. 初始化结果表,加入起始日(早于增长率表第一天)的初始细胞数 init_count <- 1000 init_day <- min(df1$Day) - 1 df2 <- data.frame( Day = init_day, A = init_count, B = init_count, C = init_count ) # 4. 循环迭代计算每日细胞数 for(i in 1:nrow(df1)){ # 提取前一天的细胞计数 prev_count <- df2[nrow(df2), species_cols] # 提取当日对应物种的增长率 day_growth <- df1[i, species_cols] # 按公式计算当日细胞数 current_count <- prev_count * (1 + day_growth) # 拼接新行追加到结果表 new_row <- data.frame( Day = df1[i, "Day"], current_count ) df2 <- rbind(df2, new_row) } # 打印计算结果 print(df2)
运行输出结果:
Day A B C 1 58 1000 1000 1000 2 59 1100 1200 1300 3 60 1760 1800 1820
方法2:累积乘积向量化实现(无循环,大数据量下效率更高)
如果数据天数、物种数较多,for循环运行速度较慢,可以直接用累积乘积函数cumprod实现,逻辑等价但运行效率高很多:
# 数据预处理部分和方法1完全一致 df1 <- data.frame(Day = c('59','60' ), A= c('.1', '.6'), B= c('.2', '.5'), C=c('.3','.4')) df1$Day <- as.numeric(df1$Day) species_cols <- c("A", "B", "C") df1[species_cols] <- lapply(df1[species_cols], function(x) as.numeric(as.character(x))) df1 <- df1[order(df1$Day), ] init_count <- 1000 init_day <- min(df1$Day) - 1 # 直接通过累积乘积计算所有天的细胞数 df2 <- rbind( # 起始日初始行 data.frame(Day = init_day, t(setNames(rep(init_count, length(species_cols)), species_cols))), # 累积计算各日结果 data.frame( Day = df1$Day, lapply(df1[species_cols], function(x) init_count * cumprod(1 + x)) ) ) print(df2)
运行结果和for循环完全一致。
扩展适配说明
- 如果需要新增/修改物种,只需要修改
species_cols向量为对应列名即可,其余代码无需改动 - 如果起始日不是固定比增长率表早1天,直接修改
init_day为目标起始日期即可 - 如果不同物种初始计数不同,只需要替换初始化
df2时对应物种的初始值,迭代逻辑不需要调整
内容的提问来源于stack exchange,提问作者MockCommunity1
相关产品推荐
相关产品推荐

