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 ответ

Решение

Вот ответ, используя purrrs 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 функции, но не используются в этой функции, поэтому они просто передаются.

Другие вопросы по тегам