【问题标题】:DuckDB R : Calculate mean and median for multiple columnsDuckDB R:计算多列的平均值和中位数
【发布时间】:2022-01-04 11:27:10
【问题描述】:

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

例如

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

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

【问题讨论】:

  • 你使用的是什么包版本的dbplyr

标签: r dbplyr duckdb


【解决方案1】:

我的猜测是这是由 dbplyr 的翻译方式引起的。它捕获并翻译每个 dplyr 命令的内容。因此,当您调用 summarise(across(everything(), list(mean, median))) 时,across(everything(), list(mean, median)) 会被传递给翻译器(无法按预期翻译)。

如果将across(everything(), list(mean, median)) 转换为每个变量的一行代码(例如var1 = mean(var1) ... var100 = median(var100)),则dbplyr 可以正确翻译这些多行代码。

也许更高版本的 dbplyr 可以在翻译之前将across(.) 转换为多行代码,正如@user63230 的评论所暗示的那样。

我们应该可以按照this答案或this答案中的方法手动执行此操作。类似于以下内容:

library(rlang)

c_names = colnames(remote_table)
patterns <- parse_exprs(paste(c_names, ' = mean(', c_names, ')'))

remote_table %>%
  summarise(!!!patterns)

我们的想法是构建我们想要执行的命令的文本字符串,使用 parse_exprs 将它们转换为表达式,最后在 dplyr 调用中取消它们(!!! 似乎在 dbplyr 翻译之前进行评估)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-03
    • 2015-11-02
    • 1970-01-01
    • 2015-09-05
    相关资源
    最近更新 更多