DuckDB R环境下一次性计算多列均值与中位数的实现问题
核心原因
DuckDB的dbplyr SQL翻译器暂时不支持向across()的.fns参数传入未命名的函数列表。本地处理内存中的R数据框时,dplyr可以直接解析这种写法;但需要将计算逻辑转换为SQL推送到DuckDB端执行时,未命名的函数列表无法完成正确的语法转换,因此运行失败。
可用解决方案
- 方案1:将聚合函数改为命名列表格式,同时建议显式添加
na.rm = TRUE参数避免空值导致结果异常,可直接运行的代码如下:
tbl(con, "mtcars") %>% summarise(across( everything(), list(mean = ~mean(.x, na.rm = TRUE), median = ~median(.x, na.rm = TRUE)) ))
- 方案2:如果需要更高的执行效率,也可以直接调用DuckDB原生的聚合函数名,跳过dplyr的翻译环节:
tbl(con, "mtcars") %>% summarise(across( everything(), list(mean = ~duckdb::sql("avg({.col})"), median = ~duckdb::sql("median({.col})")) ))
内容的提问来源于stack exchange,提问作者HCAI
相关产品推荐
相关产品推荐

