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

如何在R的tidyverse中计算数据框子集的行加权和?

计算数据框子集的行加权和

数据准备

library(tidyverse)
dd <- tibble(a = rep(1,10), b = rep(1,10), c = rep(1,10))
weight <- c(1, 5, 10)

错误尝试的问题

你嵌套使用rowwise()和map2_dfc时,会逐行生成小数据框,最终导致结果变成嵌套结构,同时因重复列名触发命名警告,这不是我们需要的单值行加权和。

正确解决方法

方法1:沿用原思路,针对列子集操作

直接选取目标列子集与对应权重做元素相乘,再行求和:

dd %>% mutate(m = rowSums(map2_dfc(select(., b:c), weight[2:3], `*`)))

输出结果:

# A tibble: 10 × 4
       a     b     c     m
   <dbl> <dbl> <dbl> <dbl>
 1     1     1     1    15
 2     1     1     1    15
 3     1     1     1    15
 4     1     1     1    15
 5     1     1     1    15
 6     1     1     1    15
 7     1     1     1    15
 8     1     1     1    15
 9     1     1     1    15
10     1     1     1    15

方法2:矩阵乘法(高效简洁)

将列子集转为矩阵,与权重向量做矩阵乘法,直接得到每行加权和:

dd %>% mutate(m = as.matrix(select(., b:c)) %*% weight[2:3])

该方法无需逐行遍历,效率远高于rowwise操作,适合大数据场景。

方法3:rowwise + c_across + 点积

用c_across选中目标列后,通过点积计算加权和,记得最后取消rowwise状态:

dd %>% 
  rowwise() %>% 
  mutate(m = c_across(b:c) %*% weight[2:3]) %>% 
  ungroup()

方法4:pmap_dbl映射求和

用pmap_dbl逐行对目标列和权重做乘积求和:

dd %>% mutate(m = pmap_dbl(select(., b:c), ~ sum(c(...) * weight[2:3])))

核心思路

  • 避免在rowwise()环境下嵌套返回数据框的函数,否则会生成嵌套结构
  • 优先选择向量/矩阵级别的操作,比逐行处理效率更高
  • 若使用rowwise,确保计算后返回的是标量而非数据框

内容的提问来源于stack exchange,提问作者Saïd Maanan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 00:32:08