首页 > 解决方案 > 使用 dbplyr 时避免算术溢出错误

问题描述

这个问题与这个问题类似但总结起来,所以发布的答案不太合适。数据是这样的,一行标识一个单位时间对:

large_sql_df
id   t   var1   var2
1    1    10     0
1    2    20     1
2    1    11     0

我想按var2时间汇总t

localdf <- large_sql_df %>%
     group_by(var, t) %>%
     summarise(count = n(), var1_mean = mean(var1))

这给出了错误:“将表达式转换为数据类型 int 的算术溢出错误。” 我认为这是因为count成为一个非常大的数字。有没有办法阻止这种情况发生而不必在 SQL 中进行整个查询?

标签: rdbplyr

解决方案


这只是详细说明了@simon-sa 答案的一些要素:

library(dplyr, warn.conflicts = FALSE)

df <- read.table(header = TRUE, text = "
id   t   var1   var2
1    1    10     0
1    2    20     1
2    1    11     0")

large_sql_df <- dbplyr::tbl_memdb(df)

localdf <- 
  large_sql_df %>%
  mutate(var1 = as.double(var1)) %>% 
  group_by(var2, t) %>%
  summarise(count = n(), var1_mean = mean(var1, na.rm = TRUE),
            .groups = "drop")

localdf
#> # Source:   lazy query [?? x 4]
#> # Database: sqlite 3.35.5 [:memory:]
#>    var2     t count var1_mean
#>   <int> <int> <int>     <dbl>
#> 1     0     1     2      10.5
#> 2     1     2     1      20

localdf %>% show_query()
#> <SQL>
#> SELECT `var2`, `t`, COUNT(*) AS `count`, AVG(`var1`) AS `var1_mean`
#> FROM (SELECT `id`, `t`, CAST(`var1` AS REAL) AS `var1`, `var2`
#> FROM `df`)
#> GROUP BY `var2`, `t`

reprex 包于 2021-07-07 创建 (v2.0.0 )


推荐阅读