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

R语言dplyr across按索引批量列相减问题及解决方案

R语言时序数据框批量分组列值相减问题解决

问题描述

我是R语言新手,第一次提问,表述若有不当请见谅。我有一个时序数据框,需要完成分组列值批量相减:比如用1RMV列的值减去同组的1A、1B、1C列的值,用2RMV列的值减去同组的2A、2B、2C列的值。

初始尝试的问题

手动操作可以完成,但自动化时遇到两个问题:

  • 用索引定位要减去的列,再用dplyr的across函数批量相减后,结果列名变成1A$1R这类异常格式
  • 用str()查看发现生成的列是单变量数据框类型

初始代码如下:

# 仅标记RMV结尾的列
df_boolean <- str_ends(colnames(df), "RMV")

# 获取RMV列的索引
col_number <- ncol(Intensity_Raw_Data)
remove_indices <- c()
for(i in 1:col_number){
  if(df_boolean[i] == TRUE){
    remove_indices <- c(background_indices, i)
  }
} 

group_number <- length(remove_indices)

# 处理第一组(第一列是时间列)
df_Subtracted <- df %>%
  mutate(across(2:(remove_indices[1] - 1), ~.  - df[(remove_indices[1])]))

# 处理剩余组
for(i in 2:group_number){
  df_Subtracted <- df_Subtracted %>%
    mutate(across((remove_indices[i-1] + 1):(remove_indices[i] - 1), ~.x - df[(remove_indices[i])]))
}

最终解决方案

参考资料后,通过按列名分组处理,并使用qpcR包的cbind.na解决列缺失问题,最终代码如下:

df_subtracted_split <- df %>%
  split.default(sub('\\d+', '', names(df))) %>%
  lapply(function(x) {names(x)[ncol(x)] <- "RMV";x}) %>%
  map(~mutate(.x, across(1:last_col(1), ~.x - RMV))) 

df_subtracted <- do.call(qpcR:::cbind.na, df_subtracted_split)

感谢GuedesBF和peter861222的帮助!


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 14:12:48