我有一个数据框如下
df <- data.frame(colname=c('A', 'B','c','D'),
corr1=c(5500, 2400, 3900,5600),
corr2=c(NA, 1600, 600 ,NA),
corr3=c(NA, NA, 1200, NA),
corr_final=c(5500,2400,2300,3800))
我需要以下公式来计算以获得corr_final。
在此,A 行和 B 行的 corr_final 值与 corr1 保持相同。然而,对于 C 和 D 行,它会根据以下等式变化。
corr_final(for C row)=3900-1600 (obtained from B row) corr_final(for D row)=5600-1200 (obtained from B row,corr2)-600(obtained from C row,corr3)
所以输出是
df <- data.frame(colname=c('A', 'B','c','D'),
corr1=c(5500, 2400, 3900,5600),
corr2=c(NA, 1600, 600 ,NA),
corr3=c(NA, NA, 1200, NA),
corr_final=c(5500,2400,2300,3800))
使用
dplyr
的case_when
方法:
注意:您对D行规则的描述与相应的值不对应。假设您的意思是 C 行中的
corr2
和 corr3
。
df <- data.frame(
colname = c("A", "B", "C", "D"),
corr1 = c(5500, 2400, 3900, 5600),
corr2 = c(NA, 1600, 600, NA),
corr3 = c(NA, NA, 1200, NA)
)
library(dplyr, warn = FALSE)
df |>
mutate(corr_final = case_when(
colname == "C" ~ corr1 - corr2[colname == "B"],
colname == "D" ~ corr1 - corr2[colname == "C"] - corr3[colname == "C"],
.default = corr1
))
#> colname corr1 corr2 corr3 corr_final
#> 1 A 5500 NA NA 5500
#> 2 B 2400 1600 NA 2400
#> 3 C 3900 600 1200 2300
#> 4 D 5600 NA NA 3800