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
相关产品推荐
相关产品推荐

