dplyr :: mutate:临时昂贵的变量作为其他几个操作的输入,rowwise

时间:2016-12-06 15:41:29

标签: r dplyr purrr

用真实数据显示我的问题有点棘手,但我希望以下解释:

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 个答案:

答案 0 :(得分:3)

以下是使用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函数,但不在该函数中使用,因此它们只是被传递