在R中按指定顺序将向量值作为指数对特定列做幂运算的方法
解决方案
你的问题出在across默认会对每一列重复使用整个Effi向量运算,导致每个列都生成了多组结果,而非对应单个效率值计算。要实现列与效率值一一对应的运算,有两种简洁的方法:
方法1:结合across与列位置匹配
先明确要处理的列的顺序(和Effi严格对应),然后通过cur_column()获取当前列的位置,匹配对应的效率值:
library(dplyr) # 定义列顺序,必须和Effi的元素顺序完全对应 target_cols <- c("delta_GOI_A_Ct", "delta_GOI_B_Ct", "delta_Mean_REF_Ct") Effi <- c(1.9, 1.8, 1.2) df7 <- df6 %>% mutate( across( all_of(target_cols), ~ Effi[match(cur_column(), target_cols)]^-.x, .names = "{sub('delta', 'FC', .col)}" ) )
方法2:用purrr::map2逐个映射列与效率值
这种方法更直观,直接把列名和对应的效率值配对计算,再绑定到原数据框:
library(dplyr) library(purrr) target_cols <- c("delta_GOI_A_Ct", "delta_GOI_B_Ct", "delta_Mean_REF_Ct") Effi <- c(1.9, 1.8, 1.2) # 定义新列名 fc_cols <- sub("delta", "FC", target_cols) df7 <- df6 %>% bind_cols( map2_dfc(target_cols, Effi, ~ .y^-df6[[.x]]) %>% set_names(fc_cols) )
为什么原代码出错
原代码中function(x) (Effi^-x)会对每个delta列的每个元素,都用Effi的三个值分别计算,最终每个列都会生成3列结果(而非1列),这显然不符合你的需求。上面两种方法都确保了单个列对应单个效率值的运算逻辑。
内容的提问来源于stack exchange,提问作者A.Mokhtari
相关产品推荐
相关产品推荐

