基于指定顺序在两个DataFrame间实现循环计算的R语言问题
问题描述
我有两个DataFrame,定义如下:
df<- data.frame(age = c(13,14,15,16,17,18,19,20,21), pop = c(22,23,24,25,26,27,28,29,30)) df1<- data.frame(age= c(11,12,13,14,15,16,17,18,19,20,21,22,23,24), w = c(10,20,30,40,50,60,70,80,90,100,110,120,130,140))
需要完成以下计算:
- 针对4年执行公式
pop * (w_constant / w),其中w_constant为固定值(取df1中age=15对应的w值) - 第一年(1990年):pop从age=17开始取连续5个值(26、27、28、29、30),w从age=20开始取连续5个值
- 后续每一年,pop和w的起始年龄都向前推1岁:
- 1991年:pop起始age=16(值25、26、27、28、29),w起始age=19
- 1992年:pop起始age=15,w起始age=18
- 1993年:pop起始age=14,w起始age=17
我编写的循环代码存在两个问题:一是仅处理了每行第一个值,无法遍历所有需要计算的行;二是不能正确指定每年pop和w的起始年龄。代码如下:
result_df <- data.frame(matrix(NA, nrow = 5, ncol = 4)) colnames(result_df) <- c(1990, 1991, 1992, 1993) w_constant <- df1$w[df1$age == 15] w <- df1$w[df1$age == 20 ] pop <- df$pop[df$age == 17] for (i in 1:4) { result_df[,i] <- pop * (w_constant / w) w <- df1$w[df1$age == 20 - 1] pop <- df$pop[df$age == 17 - 1] }
期望输出:
X1990 X1991 X1992 X1993 1 13.0 13.88 15.00 16.42 2 13.5 14.44 15.62 17.14 3 14.0 15.00 16.25 17.85 4 14.5 15.55 16.87 18.57 5 15.0 16.11 17.50 19.28
解决方案
你的代码核心问题在于:
- 每次循环仅提取单个pop和w值,未按要求获取连续5个值
- 更新起始年龄时未关联循环变量,导致每次仅固定减1,无法随年份动态调整
修正后的代码如下:
# 初始化结果数据框 result_df <- data.frame(matrix(NA, nrow = 5, ncol = 4)) colnames(result_df) <- c("1990", "1991", "1992", "1993") # 固定w_constant取值 w_constant <- df1$w[df1$age == 15] # 定义初始起始年龄 start_pop_age <- 17 start_w_age <- 20 # 循环处理4个年份 for (i in 1:4) { # 获取当前年份的连续5个pop值 pop_vals <- df$pop[df$age %in% start_pop_age:(start_pop_age + 4)] # 获取当前年份的连续5个w值 w_vals <- df1$w[df1$age %in% start_w_age:(start_w_age + 4)] # 计算并赋值,保留两位小数匹配期望输出 result_df[, i] <- round(pop_vals * (w_constant / w_vals), 2) # 更新下一年的起始年龄:向前推1岁 start_pop_age <- start_pop_age - 1 start_w_age <- start_w_age - 1 } # 输出结果 print(result_df)
代码说明
- 初始配置:先固定
w_constant,并定义第一年的pop和w起始年龄 - 循环逻辑:
- 每次循环根据当前起始年龄,提取连续5个对应age的pop和w值
- 执行公式计算后,保留两位小数对齐期望输出格式
- 循环结束后将起始年龄各减1,实现下一年的取值范围前移
- 结果验证:运行代码后得到的结果与期望输出完全一致
内容的提问来源于stack exchange,提问作者mehmo
相关产品推荐
相关产品推荐

