Как мне преодолеть деление на нулевую ошибку в R - PullRequest
0 голосов
/ 13 февраля 2020

Dividing by Zero Error encountered

Привет, стек! Я столкнулся с этой ошибкой, работающей сегодня. Я не уверен, как именно обойти это. Я прочитал, чтобы использовать na.rm в моей мутации, и я попробовал это, но это не сработало. Я могу быть совершенно не прав.


library("DBI")
library("dbplyr")
library("odbc")
library("dplyr")
library("stringr")
library("tidyverse")
library("lubridate")


  select(CustomerID, PostalCodeID, OrderID, ItemID, WrittenSales, WrittenUnits, TransCodeID, SalesType, ProductID, ProductName, GroupID, SubGroupID, CategoryID, TransDate, LocationID, LocationName) %>%

  filter(SalesType == "W",
         LocationID %in% Louisville) %>%

  group_by(CustomerID, PostalCodeID, WrittenSales, TransCodeID, SalesType, ProductID, ProductName, GroupID, SubGroupID, CategoryID, TransDate, LocationID, LocationName) %>%
  summarise(WrittenUnits_purchased = sum(WrittenUnits)) %>%
  ungroup() %>%

  group_by(CustomerID) %>%
  mutate(prop_of_total = WrittenUnits_purchased/sum(WrittenUnits_purchased)) %>%
  ungroup()```

1 Ответ

1 голос
/ 13 февраля 2020

Хотя это проблема SQL, ее можно уменьшить в коде.

Настройка:

# library(odbc) or similar, for the DB driver
# con <- DBI::dbConnect(...)
DBI::dbExecute(con, "create table r2 (x int, y int)")
# [1] 0
DBI::dbExecute(con, "insert into r2 (x,y) values (1,1),(2,0)")
# [1] 2
DBI::dbGetQuery(con, "select * from r2")
#   x y
# 1 1 1
# 2 2 0

Демонстрация проблемы в базе R и SQL на основе исправления:

DBI::dbGetQuery(con, "select x/y as xy from r2")
# Error in result_fetch(res@ptr, n) : 
#   nanodbc/nanodbc.cpp:2593: 22012: [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Divide by zero error encountered. 
# Warning in dbClearResult(rs) : Result already cleared
DBI::dbGetQuery(con, "select (case when y = 0 then null else x/y end) as xy from r2")
#   xy
# 1  1
# 2 NA

Поскольку вы используете dbplyr, вот эта сторона вещей:

library(dplyr)
library(dbplyr)
tbl(con, "r2") %>%
  collect()
# # A tibble: 2 x 2
#       x     y
#   <int> <int>
# 1     1     1
# 2     2     0
tbl(con, "r2") %>%
  mutate(xy = x/y) %>%
  collect()
# Error in result_fetch(res@ptr, n) : 
#   nanodbc/nanodbc.cpp:2593: 22012: [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Divide by zero error encountered. 
# Warning in dbClearResult(res) : Result already cleared
tbl(con, "r2") %>%
  mutate(xy = if_else(y == 0, NA, x/y)) %>%
  collect()
# # A tibble: 2 x 3
#       x     y    xy
#   <int> <int> <int>
# 1     1     1     1
# 2     2     0    NA
...