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

