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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 02:15:39