如果你愿意
data.table
解决方案,这应该很快:
library(data.table)
setDT(df)
keys <- data.table(id=c("A","B","C"), x=c("b1","a3","a1"))
onv <- c("id","x")
vars <- c("y","z")
df[df[keys, on=onv], on=onv[1], (vars) := .SD[,..vars] - mget(paste0("i.", vars))][!keys, on=onv]
# id x y z
#1: A a1 -1 -1
#2: A c1 1 1
#3: B b3 1 1
#4: C b1 1 1
#5: C c1 2 2
#6: C d1 3 3