Вы можете использовать colMeans
/ colMeans2
, чтобы сделать это в векторизации
df / colMeans(df)
# or
df / matrixStats::colMeans2(as.matrix(df))
# yields
var1 var2
1 0.9307705 0.4228236
2 1.9674104 0.9776180
3 1.1397295 0.4255726
4 2.0279614 0.9090271
5 0.9987836 0.4519303
...
с данными
set.seed(123)
df <- data.frame(var1= rnorm(20, 15, 1.5), var2= rnorm(20, 7.5, 1))
Добавление
Чтобы ответить на ваш вопрос:
В качестве альтернативы, метод Vectorize
стоит проверить в таком случае или в семействе apply
(vapply
является, безусловно, наиболее эффективным) -в вашем случае vapply(1:ncol(df), function (n) normFunc(df[,n]), numeric(nrow(df)))
будет работать.Или хорошо построенный цикл иногда может быть даже быстрее.