Я предлагаю поискать tidyverse, в данном случае конкретно dplyr (подпакет tidyverse).Tidyverse - это огромная коллекция полезных и «аккуратных» (иначе, FAST) операций.Как только вы прибываете в порядок, вы никогда не возвращаетесь.
Во-первых, просто несколько общих математических советов.Взятие среднего значения последовательности может быть сделано без фактического генерирования всей последовательности.Вам просто нужны начало и конец последовательности, так как среднее значение первого и последнего числа совпадает со средним значением всей последовательности.Если ваши реальные данные - это вектор непоследовательных чисел, дайте мне знать.Следующие три строки кода являются доказательством того, что среднее число первого и последнего числа совпадает со средним значением полной последовательности:
seqstart <- sample(1:50, 1, replace = T)
seqend <- sample(51:100, 1, replace = T)
mean(c(seqstart, seqend)) == mean(seqstart:seqend)
Если вы мне не верите, вставьте эти 3 строкив ваш потребитель, пока не найдете ЛОЖНОЕ значение или пока вы мне не поверите.:)
library(tidyverse)
set.seed(1)
n = 10000000
tab <- data.frame(x1 = sample(1:100, n, replace = T), y1 = sample(1:100, n,
replace = T), x2 = sample(1:100, n, replace = T), y2 = sample(1:100, n, replace =
T))
Обратите внимание, я еще не использую матрицу.Вы можете воссоздать свою матрицу позже.Если по какой-то причине вы начинаете с матрицы, то, честно говоря, я бы просто изменил ее на обычную таблицу, чтобы мне было проще использовать аккуратные операции.Может быть, гуру может научить нас, как использовать обратные операции с матрицами, я не знаю как.Решение:
tic("test 1")
a <- 40
b <- 5
test <- tab %>% mutate(c = 1) %>%
mutate(res1 = if_else(c==1,(((x1 - a)+(x1 - 1)+(y1 + 1)+(y1 + 40))/4)*b,(((x1 - a)+
(x1 - 1)+(y1 + 1)+(y1 + 40))/4))) %>%
mutate(res2 = if_else(c==1,(((x2 - a)+(x2 - 1)+(y2 + 1)+(y2 + 40))/4)*b,(((x2 - a)+
(x2 - 1)+(y2 + 1)+(y2 + 40))/4)))
test %>% select(res1,res2) -> test
toc()
тест 1: 8,91 с прошло достаточно быстро для меня.
Обратите внимание, что я создал новый столбец с mutate под названием "c" и установил его в 1. Это потому, чтоdplyr не нравится, если вы используете операторы if_else, которые имеют логические проверки по отношению к переменной окружения (и если эта переменная всегда равна 1, зачем нам кодировать это в первую очередь?).Таким образом, я предполагаю, что вы планируете использовать «с», который иногда может быть 1, а иногда и 0, и я предлагаю здесь, чтобы вы имели эти данные в столбце, на который мы можем ссылаться.