在下面的数据集中,如果
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"))
您可以像这样分两步完成此操作:
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