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

如何用dplyr或其他方法计算数据框所有列组合的行均值?

问题描述

我有如下两个DataFrame:
第一个(假设名为df1):

structure(list(ffw0 = c(8.60799803435064, 8.34185836453619, 8.07471159730671, 
7.82091460501107, 7.56772724986936), ffw1 = c(8.4937475524497, 
7.99877773077364, 7.40230840036861, 6.72275626701698, 5.96367684510491
), ffw2 = c(8.80102997756335, 8.73105190900452, 8.65977919061515, 
8.60566795392347, 8.55234042159471)), row.names = c(NA, -5L), class = "data.frame")

第二个名为comb:

comb <- structure(list(ffw0 = c(8.607998, 8.341858, 8.074712, 7.820915, 7.567727),
                       ffw1 = c(8.493748, 7.998778, 7.402308, 6.722756, 5.963677),
                       ffw2 = c(8.801030, 8.731052, 8.659779, 8.605668, 8.552340),
                       year = c(2026, 2027, 2028, 2029, 2030),
                       arima210 = c(8.005053, 7.692402, 7.583277, 7.545043, 7.531630),
                       arima211 = c(7.841940, 7.189011, 6.761488, 6.480838, 6.296588),
                       com = c(7.923496, 7.440706, 7.172382, 7.012941, 6.914109)),
                  row.names = 1:5, class = "data.frame")

我需要计算所有列组合的行均值:包括所有两两列组合(x,y)的行均值、所有三列组合(x,y,z)的行均值,直到所有列的组合的行均值。之前尝试过一个旧方法但会产生无法解释的极大值,想知道能否用dplyr实现,或者有其他可靠方法。


方法一:dplyr + purrr 实现

核心逻辑是生成所有k≥2的列组合,对每个组合计算行均值,再合并回原数据框:

library(dplyr)
library(purrr)

# 筛选目标列(排除非数值列year,若需包含则去掉select(-year))
target_cols <- comb %>% select(-year) %>% colnames()

# 生成从2列到全列的所有组合
all_combinations <- map(2:length(target_cols), ~combn(target_cols, .x, simplify = FALSE)) %>%
  flatten()

# 计算每个组合的行均值并合并
result <- comb %>%
  bind_cols(
    map_dfc(all_combinations, ~rowMeans(comb[.x]) %>%
              set_names(paste0("mean_", paste(.x, collapse = "_"))))
  )

# 查看结果
head(result)

关键点:

  • 列名自动用mean_列名1_列名2...格式命名,便于识别对应组合;
  • 明确排除非数值列,避免因混入整数列(如year)导致的异常均值。

方法二:Base R 轻量实现

无需加载第三方包,用基础R函数完成:

# 确定目标列(排除year)
target_cols <- setdiff(colnames(comb), "year")

# 生成所有k≥2的列组合
all_combs <- unlist(lapply(2:length(target_cols), function(k) combn(target_cols, k, simplify = FALSE)), recursive = FALSE)

# 计算每个组合的行均值,命名后合并
mean_cols <- lapply(all_combs, function(cols) rowMeans(comb[cols]))
names(mean_cols) <- sapply(all_combs, function(cols) paste0("mean_", paste(cols, collapse = "_")))

result_base <- cbind(comb, as.data.frame(mean_cols))

# 查看结果
head(result_base)

异常值原因排查

之前的方法出现极大值,大概率是以下原因:

  • 误将非数值列(如year)纳入计算,整数年份会拉高均值;
  • 组合生成逻辑错误,出现重复列或无效索引;
  • 未正确筛选目标列,混入了不符合要求的列。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.01 16:12:31