Это довольно общий способ выполнить то, что вы просили:
Сначала несколько фиктивных данных:
df <- data.frame(
x.old = runif(1000),
x.new = runif(1000),
y.old = runif(1000),
y.new = runif(1000)
)
Извлеките префиксы, помечая слово перед каждым .
pfx <- unique(gsub("(^..*)\\...*$", "\\1", names(df)))
pfx <- setNames(pfx, paste0(pfx, ".delta"))
Зацикливайтесь на каждом из префиксов и используйте их для индексации исходных столбцов data.frame и вычисления дельты.Такие циклы хороши в R.
deltas <- lapply(pfx, function(col) {
old <- paste0(col, ".old")
new <- paste0(col, ".new")
df[[new]] - df[[old]]
})
Добавьте дельты к исходному набору данных:
res <- cbind(df, deltas)
> head(res)
x.old x.new y.old y.new x.delta y.delta
1 0.16582237 0.65722478 0.69491911 0.0321141 0.4914024 -0.6628050
2 0.31899968 0.86988894 0.63381341 0.3421112 0.5508893 -0.2917022
3 0.27247366 0.52519659 0.08306147 0.9015832 0.2527229 0.8185217
4 0.04901993 0.26079681 0.79428604 0.9277292 0.2117769 0.1334432
5 0.14126815 0.03030174 0.54559952 0.9441938 -0.1109664 0.3985943
6 0.21614648 0.03249826 0.90492169 0.1399136 -0.1836482 -0.7650081