3

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

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

4

1 回答 1

3

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

于 2016-12-06T16:35:15.870 回答