如何在R中结合case_when条件实现减法与乘法运算
问题排查与修正
原代码核心问题
- 逻辑错误:计算修正项时误用了当前行的
corr1,而非参考行(B/C行)的corr1。比如C行的修正项应该是B行corr1 * B行corr3,但原代码写成了当前行corr1 * B行corr3,导致结果不符合预期。 - 代码健壮性不足:直接用
corr3[colname == "B"]这种列索引方式,若后续数据框行顺序变动,会导致取值错误,可读性也较差。
修正方案
方案1:提前提取参考值(推荐)
先提取B、C行的固定参考值,再执行计算,逻辑清晰且不易出错:
df1 <- data.frame(colname=c("A","B","C","D"), corr1=c(5500, 2400, 3900,5600), corr2=c(2.1944, 2.1936, 2.1934,2.1932), corr3=c(NA, 0.7934, NA ,NA), corr4=c(NA, 0.3104, NA, NA), corr5=c(NA, NA, 0.7933, NA) ) library(dplyr, warn = FALSE) # 提取B、C行的参考值 b_corr1 <- df1$corr1[df1$colname == "B"] b_corr3 <- df1$corr3[df1$colname == "B"] b_corr4 <- df1$corr4[df1$colname == "B"] c_corr1 <- df1$corr1[df1$colname == "C"] c_corr5 <- df1$corr5[df1$colname == "C"] # 计算最终值 df1 <- df1 %>% mutate(corr_final = case_when( colname == "C" ~ corr1*corr2 - (b_corr1 * b_corr3), colname == "D" ~ corr1*corr2 - (b_corr1 * b_corr4) - (c_corr1 * c_corr5), .default = corr1*corr2 ))
方案2:dplyr链内完成计算
如果希望在一条链式操作中完成,可结合filter和pull提取参考值,最后移除临时列:
df1 <- data.frame(colname=c("A","B","C","D"), corr1=c(5500, 2400, 3900,5600), corr2=c(2.1944, 2.1936, 2.1934,2.1932), corr3=c(NA, 0.7934, NA ,NA), corr4=c(NA, 0.3104, NA, NA), corr5=c(NA, NA, 0.7933, NA) ) library(dplyr, warn = FALSE) df1 <- df1 %>% mutate( # 临时提取参考值 b_corr1 = filter(., colname == "B") %>% pull(corr1), b_corr3 = filter(., colname == "B") %>% pull(corr3), b_corr4 = filter(., colname == "B") %>% pull(corr4), c_corr1 = filter(., colname == "C") %>% pull(corr1), c_corr5 = filter(., colname == "C") %>% pull(corr5), # 计算最终值 corr_final = case_when( colname == "C" ~ corr1*corr2 - (b_corr1 * b_corr3), colname == "D" ~ corr1*corr2 - (b_corr1 * b_corr4) - (c_corr1 * c_corr5), .default = corr1*corr2 ) ) %>% select(-b_corr1, -b_corr3, -b_corr4, -c_corr1, -c_corr5) # 清理临时列
内容的提问来源于stack exchange,提问作者dk1
相关产品推荐
相关产品推荐

