我有一个duckdb,想一次计算平均值和中位数或多列:
例如
#This works:
mtcars %>%
summarise(across(everything(),list(mean, median))
#This doesn't
tbl(con,"mtcars")%>%
summarise(across(everything(),list(mean, median))
我的猜测是这是由 dbplyr 的翻译方式引起的。它捕获并翻译每个 dplyr 命令的内容。因此,当您调用summarise(across(everything(), list(mean, median)))
then时across(everything(), list(mean, median))
,它会被传递给翻译器(无法按预期翻译)。
如果across(everything(), list(mean, median))
将每个变量(例如 )转换为一行代码,var1 = mean(var1) ... var100 = median(var100)
则 dbplyr 可以正确翻译这些多行代码。
正如@user63230 的评论所暗示的那样,也许更高版本的 dbplyr 可以across(.)
在翻译之前转换为多行代码。
我们应该能够按照此答案或此答案中的方法手动执行此操作。类似于以下内容:
library(rlang)
c_names = colnames(remote_table)
patterns <- parse_exprs(paste(c_names, ' = mean(', c_names, ')'))
remote_table %>%
summarise(!!!patterns)
这个想法是构建我们想要执行的命令的文本字符串,使用 将它们转换为表达式parse_exprs
,最后在 dplyr 调用中取消它们(!!!
似乎在 dbplyr 翻译之前进行评估)。