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

如何按列位置批量处理多列生成新列(R语言)

宽格式数据集批量计算均值与均方根误差

我有一个宽格式数据集,每条记录包含2-4个以measure_开头的指标列和2-4个以FISE_开头的标准误列。需要实现两个需求:

  • 计算所有指标列的均值,生成新列mean.meas
  • 计算所有标准误列的均方根误差(即各列值平方后取均值再开根号),生成新列rmse.fise

已知指标列固定从第6列开始,共meas.num列;标准误列紧随指标列之后。手动指定列名可以实现,但当列数变化时过于繁琐,之前尝试的基于列位置的方法均报错或结果异常,现寻求可靠的批量实现方案。

数据集示例

dput(head(lev1uni.wide))
structure(list(final_id = 10001:10006, uni = c(1L, 1L, 1L, 1L, 
1L, 1L), uri = c(1, 2, 3, 4, 5, 6), comboid = c(100012019, 100022019, 
100032019, 100042019, 100052019, 100062019), year = c(2019L, 
2019L, 2019L, 2019L, 2019L, 2019L), measure_nl_netops_km = c(-4.88, 
8.93, -1.97, 10.29, 2.14, 0.5), measure_nl_netops_trust = c(4.38, 
10.64, 4.38, 10.64, 4.38, 10.64), FISE_nl_netops_km = c(2.166301918, 
1.459912326, 0.78, 1.86, 2.082442076, 0.81), FISE_nl_netops_trust = c(1.84, 
1.87, 1.84, 1.87, 1.84, 1.87)), row.names = c(NA, -6L), class = c("tbl_df", 
"tbl", "data.frame"))

手动实现(仅作参考)

手动指定列名计算指标列均值的代码如下,能得到预期的mean.meas列:

lev1uni.wide %>% mutate(mean.meas=measure_nl_netops_km *.5 + measure_nl_netops_trust * .5 )

预期mean.meas结果:

[1] -0.250  9.785  1.205 10.465  3.260  5.570

之前的错误尝试

  1. 执行后mean.meas为嵌套数据框,而非数值列:
lev1uni.wide.2 <- lev1uni.wide %>%
        mutate(mean.meas=.[,6] * .5 + .[,7] * .5)
  1. 执行后mean.meas全为NA,触发警告argument is not numeric or logical: returning NA:
lev1uni.wide %>% mutate(mean.meas=mean(meas.name.list[1], meas.name.list[2], na.rm=TRUE))

正确批量处理方案

方案1:基于列名前缀匹配(更鲁棒,推荐)

利用dplyr的across函数,通过列名前缀自动匹配目标列,无需依赖列位置:

library(dplyr)

# 计算指标列均值
lev1uni.wide <- lev1uni.wide %>%
  mutate(mean.meas = rowMeans(across(starts_with("measure_")), na.rm = TRUE))

# 计算标准误列的均方根误差
lev1uni.wide <- lev1uni.wide %>%
  mutate(rmse.fise = sqrt(rowMeans(across(starts_with("FISE_"))^2, na.rm = TRUE)))

方案2:基于列位置(严格匹配需求中的列位置规则)

如果必须依赖列位置(指标列从第6列开始,共meas.num列,标准误列紧随其后),可以用across结合列索引范围:

meas.num <- 2 # 根据实际列数调整

# 计算指标列均值(第6列到第6+meas.num-1列)
lev1uni.wide <- lev1uni.wide %>%
  mutate(mean.meas = rowMeans(across(6:(6 + meas.num - 1)), na.rm = TRUE))

# 计算标准误列均方根误差(指标列之后的meas.num列)
lev1uni.wide <- lev1uni.wide %>%
  mutate(rmse.fise = sqrt(rowMeans(across((6 + meas.num):(6 + 2*meas.num - 1))^2, na.rm = TRUE)))

方案3:用rowwise逐行计算(适合复杂自定义逻辑)

如果需要更灵活的逐行计算逻辑,可以用rowwise:

lev1uni.wide <- lev1uni.wide %>%
  rowwise() %>%
  mutate(mean.meas = mean(c_across(starts_with("measure_")), na.rm = TRUE),
         rmse.fise = sqrt(mean(c_across(starts_with("FISE_"))^2, na.rm = TRUE))) %>%
  ungroup()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 04:23:21