1

我有一个duckdb,想一次计算平均值和中位数或多列:

例如

#This works:
mtcars %>%
summarise(across(everything(),list(mean, median))

#This doesn't
tbl(con,"mtcars")%>%
summarise(across(everything(),list(mean, median))
4

1 回答 1

1

我的猜测是这是由 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 翻译之前进行评估)。

于 2021-11-27T08:40:47.920 回答