有没有一种方法可以根据单行的值添加新列而不需要循环?

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

在下面的数据集中,如果

Loc==1
,我想计算一个值,但是如果
Loc!=1
,我想根据我在第一个条件中计算的值计算一个值(在
Loc==1
计算的值) )。我知道我可以在循环中完成此任务,但如果可以的话,我会尽力避免循环。它应该看起来像这样,请注意
first
对象实际上并不存在,它只是一个占位符,以更好地解释我正在寻找的内容。

data2 <- data %>%
  mutate(Residual = ifelse(Loc==1,
                           pmin(XD_VD+SE, val), # first calc
                           pmin(first + SE, val))) # second calc based on first calc

如果有is一种不使用循环的方法,有人能想到吗?这是我的数据片段:

structure(list(Loc = 1:5, val = c(29, 49, 44, 50, 37), XD = c(66.12, 
66.12, 66.12, 66.12, 66.12), VD = c(30.1780172853143, 30.1780172853143, 
30.1780172853143, 30.1780172853143, 30.1780172853143), XD_VD = c(35.9419827146857, 
35.9419827146857, 35.9419827146857, 35.9419827146857, 35.9419827146857
), SE = c(0.77, 0.77, 0.77, 0.77, 0.77)), row.names = c(NA, -5L
), class = c("tbl_df", "tbl", "data.frame"))
r tidyverse
1个回答
0
投票

您可以像这样分两步完成此操作:

library(dplyr, warn = FALSE)

data %>%
  mutate(
    Residual = pmin(XD_VD + SE, val),
    Residual = ifelse(Loc == 1,
      Residual,
      pmin(Residual[Loc == 1] + SE, val)
    )
  )
#> # A tibble: 5 × 7
#>     Loc   val    XD    VD XD_VD    SE Residual
#>   <int> <dbl> <dbl> <dbl> <dbl> <dbl>    <dbl>
#> 1     1    29  66.1  30.2  35.9  0.77     29  
#> 2     2    49  66.1  30.2  35.9  0.77     29.8
#> 3     3    44  66.1  30.2  35.9  0.77     29.8
#> 4     4    50  66.1  30.2  35.9  0.77     29.8
#> 5     5    37  66.1  30.2  35.9  0.77     29.8
© www.soinside.com 2019 - 2024. All rights reserved.