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

