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

如何简化R语言中生成两列统计衍生列的代码(避免多代码块)

问题描述

我有一个扩展数据集,简化后的示例如下:

BEZ <- c(0.5, 1.5)
var <- c(0, 1.5 )
bar <- c(3, 1.5)

BEZ1 <- c(0, 0.5)
var1 <- c(4, 4)
bar1 <- c(4, 4.5)

dat <- data.frame(BEZ, var, bar, BEZ1, var1, bar1)
dat

我希望添加两列最终统计列:

  • 所有非BEZ开头列的行求和结果;
  • 上述结果除以所有名称含BEZ的列的行求和结果。

我当前的实现代码如下:

scores = dat %>% 
  select(-starts_with('BEZ')) %>% 
  #replace(is.na(.), 0) %>% 
  mutate(score_1 = rowSums(.), 
         score_2 = score_1/rowSums(dat %>% select(starts_with('BEZ'))))

new = cbind(dat, scores[, 5:6])
new

但我希望找到更简洁的实现方式,避免创建多个代码块,请问有什么替代方案?


简化实现方案

可以直接在原数据框上通过dplyr链式操作完成,无需创建中间对象或额外拼接步骤:

library(dplyr)

# 保留中间计算列的版本
dat %>%
  mutate(
    bez_sum = rowSums(select(., starts_with("BEZ")), na.rm = TRUE),
    score_1 = rowSums(select(., -starts_with("BEZ")), na.rm = TRUE),
    score_2 = score_1 / bez_sum
  )

说明:

  • select(., starts_with("BEZ"))直接在当前数据框中筛选BEZ开头的列,计算行和得到bez_sum;
  • select(., -starts_with("BEZ"))筛选非BEZ开头的列,计算行和得到score_1;
  • 最后直接通过score_1 / bez_sum得到score_2;
  • na.rm = TRUE用于处理数据中可能存在的缺失值,对应你注释掉的缺失值替换逻辑。

如果不需要保留中间的bez_sum列,可以进一步精简:

dat %>%
  mutate(
    score_1 = rowSums(select(., -starts_with("BEZ")), na.rm = TRUE),
    score_2 = score_1 / rowSums(select(., starts_with("BEZ")), na.rm = TRUE)
  )

这样一步就能得到包含新增统计列的完整数据框,代码逻辑连贯且无需额外的对象创建与拼接操作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 16:35:20