dplyr::mutate:临时昂贵的变量作为其他几个操作的输入,按行
dplyr::mutate: temporary expensive variable as input to several other operations, rowwise
用真实数据显示我的问题有点棘手,但我希望以下内容能解释:
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
?
这是使用 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
函数,但未在该函数中使用,因此它们只是被传递继续。
用真实数据显示我的问题有点棘手,但我希望以下内容能解释:
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
?
这是使用 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
函数,但未在该函数中使用,因此它们只是被传递继续。