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

