Мне нужно рассчитать несколько статистических параметров для вектора, опуская при этом каждое значение в нем один раз.Поскольку это происходит в большом наборе данных со многими параметрами, я ищу общий подход для оптимизации производительности.Простым примером может быть:
v <- c(9, 14, 8, 12, 5, 10, 6, 9, 9, 9, 9, 10, 8, 11, 9, 9, 10, 6, 10, 10)
sapply(1:length(v), function(x){
var(v[-x])
})
В результате получается желаемый результат с вектором, содержащим общую дисперсию v
, если каждый элемент пропущен один раз:
[1] 4.134211 4.134211 4.134211 4.134211 4.134211 4.134211 4.134211 4.134211 4.134211 4.134211 4.134211 4.134211 4.134211 4.134211 4.134211 4.134211
[17] 4.134211 4.134211 4.134211 4.134211
Как указаноэто приводит к снижению производительности при работе с большими наборами данных и несколькими параметрами.Поскольку циклы иногда позорятся за медлительность , я ищу эффективные альтернативы, то есть векторизованные функции.
Спасибо!
РЕДАКТИРОВАТЬ: Оба предложенных решения значительно повышают производительность.В то время как решение Dominiks побеждает в гонке за скоростью, подход Rolands является более общим и может использоваться более широко.Поэтому ответ Rolands помечен как правильный, а я буду использовать решение Dominiks для этой конкретной ситуации.Спасибо обоим!
Results with N = 2000
Unit: milliseconds
expr min lq mean median uq max neval
original approach 117.2269 122.38290 130.933014 124.95565 128.69030 453.0770 100
approach from Roland 57.1625 64.75505 96.255364 67.88550 168.55915 204.6941 100
approach from Dominik 2.7083 2.89440 3.395894 2.99545 3.24165 30.0510 100