Не уверен, что это более эффективно, но если вас интересует dplyr
+ purrr
решение ...
library(dplyr)
library(purrr)
df <- structure(list(a = c(2L, 3L, 2L),
b = c(56L, 89L, 47L),
c = c(14L, 17L, 14L),
d = c(16L, 13L, 19L)),
class = "data.frame",
row.names = c(NA, -3L))
df %>%
mutate(e = b - imap_dbl(names(.)[a + 1], ~ pluck(df, .x, .y)))
#> a b c d e
#> 1 2 56 14 16 42
#> 2 3 89 17 13 76
#> 3 2 47 14 19 33
Создано 06.05.2020 пакет REPEX (v0.3.0)