dplyr::mutate: временная дорогая переменная в качестве ввода для нескольких других операций, по строкам
Немного сложно показать мою проблему с реальными данными, но я надеюсь, что следующее объясняет:
data_frame(a=c(1,2), b=c(3,4)) %>%
rowwise %>%
mutate(c = a*b, d = c-1, e=c+2) %>%
ungroup
В приведенном выше примере, конечно, rowwise
не нужен
Теперь давайте предположим, что расчет сделать c
это отнимает много времени, c
это большой объект и не векторизован. Таким образом, вам не нужно выполнять его дважды, и вы хотите, чтобы он очищался из памяти после каждого вычисления строки.
Есть ли умный способ сделать это? Возможно с purrr::map
?
1 ответ
Вот ответ, используя purrr
s invoke_rows
,
library(purrr)
MyDf<-data.frame(a=c(1,2), b=c(3,4))
invoke_rows(.d=MyDf, .f=function(a,b){c=a*b
c(d=c-1,
e=c+2)},
.collate="cols")
Обновить
В ответ на комментарий @JanStanstrup, если у вас есть другой столбец, который вы хотите включить в вывод, но которого нет в расчете, вы можете сделать это:
MyDf<-data.frame(a=c(1,2), b=c(3,4), dummy=c(6,7))
invoke_rows(.d=MyDf, .f=function(a,b,...){c=a*b
c(d=c-1,
e=c+2)},
.collate="cols")
Вот, dummy
и любые другие столбцы передаются через ...
в качестве аргумента .f
функции, но не используются в этой функции, поэтому они просто передаются.