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

R语言如何按分组将数据框列值除以另一数据框同组所有对应值

R语言按组配对计算实现方案

直接提供可运行的实现代码,基于你提到的分组处理逻辑开发:

方法1:tidyverse 实现(推荐,代码简洁易读)

首先加载依赖包:

library(dplyr)
library(tidyr)

核心计算代码:

result <- df_B %>%
  # 按name分组,把同组所有rate打包为列表
  group_by(name) %>%
  summarise(rate_col = list(rate), .groups = "drop") %>%
  # 和A表按name关联,保留A表所有行
  right_join(df_A, by = "name") %>%
  # 把打包的rate拆成多行,自动完成同组下A每行匹配所有B的rate
  unnest(rate_col) %>%
  # 做除法计算
  mutate(counts = counts / rate_col) %>%
  # 保留需要的列,和要求的输出结构一致
  select(name, trial, counts)

逻辑说明

  • 处理后A组(name=A)输出3行A数据 * 3个同组rate = 9行,和示例1-9行完全匹配
  • B组(name=B)输出3行A数据 * 1个同组rate = 3行,和示例10-12行完全匹配
  • C组(name=C)输出3行A数据 * 2个同组rate = 6行,给出的示例结果漏写了C组trial=28除以trial=28对应rate、C组trial=36除以trial=3对应rate2行,属于笔误。

方法2:base R 实现(无需安装第三方包)

# 按name拆分两个数据框
a_split <- split(df_A, df_A$name)
b_split <- split(df_B, df_B$name)

# 逐组做笛卡尔配对计算
res_list <- lapply(names(a_split), function(group_name){
  a_part <- a_split[[group_name]]
  b_rates <- b_split[[group_name]]$rate
  # 生成组内行配对索引
  pair_idx <- expand.grid(a_row = seq_len(nrow(a_part)), rate_val = b_rates)
  # 组装结果
  data.frame(
    name = group_name,
    trial = a_part$trial[pair_idx$a_row],
    counts = a_part$counts[pair_idx$a_row] / pair_idx$rate_val
  )
})

# 合并所有组的结果
result <- do.call(rbind, res_list)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 13:54:05