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

R语言:基于比例拆分数据框指定列值的优化实现

更简洁的实现方案

你可以用dplyr的分组、连接与向量化操作替代循环,代码更简洁易读,同时完全匹配你的需求逻辑:

library(dplyr)

# 计算a组var1和var2的总基数
from_totals <- myt_repeating %>%
  filter(name == "a") %>%
  summarise(across(c(var1, var2), sum))

# 生成各分组的调整参数:每行需调整的数值
group_adjust <- myt_repeating %>%
  count(name) %>%
  left_join(rel_table, by = "name") %>%
  left_join(from_totals, by = character()) %>%
  mutate(
    # a组:原数值乘以比例;其他组:分配总量除以该行数
    across(c(var1, var2), ~ ifelse(name == "a", .x * proportion, (.x * proportion) / n))
  )

# 应用调整到原数据
result <- myt_repeating %>%
  left_join(group_adjust, by = "name", suffix = c("", "_add")) %>%
  mutate(
    across(c(var1, var2), ~ ifelse(name == "a", .x * proportion, .x + .x_add)),
    # 清理临时辅助列
    across(c(n, proportion, ends_with("_add")), ~ NULL)
  )

关键步骤说明

  1. 计算分配基数:先提取a组的var1和var2总和,这是后续比例分配的基础。
  2. 生成调整规则:
    • 统计每个分组的行数,用于平均分配额度
    • 关联比例表,计算每个分组的分配总量,再转换为每行的调整值
  3. 执行调整:将调整规则与原数据关联,对var1和var2分别执行保留/追加操作,最后清理临时列。

验证总和一致性

你可以用以下代码确认调整前后的总和完全一致:

# 原数据总和
colSums(myt_repeating[, c("var1", "var2")])
# 调整后数据总和
colSums(result[, c("var1", "var2")])

方案优势

  • 摒弃循环,用向量化操作提升处理效率(数据量越大,优势越明显)
  • 代码逻辑模块化,每一步意图清晰,便于维护和修改
  • 利用dplyr链式语法,可读性远超循环写法

内容的提问来源于stack exchange,提问作者stats_noob

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 15:17:15