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

