如何从另一列(具有不同的行号)中仅减去一列中的某些值

问题描述 投票:0回答:1

我有一个数据框如下

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))
r dplyr tidyverse data-wrangling mutate
1个回答
0
投票

使用

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
© www.soinside.com 2019 - 2024. All rights reserved.