Столбец, полученный из базы данных, должен быть преобразован в numeri c, чтобы его можно было использовать. - PullRequest
0 голосов
/ 05 августа 2020

Если я извлекаю данные из базы данных (база данных MySQL с RMariaDB или ODB C), я получаю ошибки при использовании данных как есть с несколькими функциями R (hist, boxplot, но не sd или summary ):

Error in hist.default(lockout_per_hour$alarm_count) : 
  some 'x' not counted; maybe 'breaks' do not span range of 'x'
In addition: Warning message:
In pretty.default(range(x), n = breaks, min.n = 1) :
  Internal(pretty()): very small range.. corrected

Если я просто экспортирую те же данные в файл CSV и импортирую их в RStudio, все работает, в противном случае, если я хочу использовать данные из базы данных, я должен преобразовать их в numeri c.

По запросу, код:

library(DBI);
db <- DBI::dbConnect(odbc::odbc(), 'my-dns');

q_perHour = "SELECT
DATE_FORMAT(MIN(timestamp), '%H') hour, COUNT(*) count
FROM alarm
GROUP BY YEAR(timestamp), MONTH(timestamp), DAY(timestamp), HOUR(timestamp)
LIMIT 100";

rs = dbSendQuery(db, q_perHour);
data <- dbFetch(rs);

hist(data$count); # KO
sd(data$count); # OK

вывод dput:

structure(list(hour = c("18", "19", "20", "21", "22", "23", "00", 
"01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", 
"12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", 
"23", "00", "01", "02", "03", "04", "05", "06", "07", "08", "09", 
"10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", 
"21", "22", "23", "00", "01", "02", "03", "04", "05", "06", "07", 
"08", "09", "10", "11", "12", "13", "14", "15", "16", "17", "18", 
"19", "20", "21", "22", "23", "00", "01", "02", "03", "04", "05", 
"06", "07", "08", "09", "10", "11", "12", "13", "14", "15", "16", 
"17", "18", "19", "20", "21"), count = structure(c(2.47032822920623e-323, 
4.94065645841247e-323, 3.95252516672997e-323, 3.95252516672997e-323, 
3.45845952088873e-323, 3.95252516672997e-323, 8.39911597930119e-323, 
1.48219693752374e-323, 3.95252516672997e-323, 3.45845952088873e-323, 
5.92878775009496e-323, 5.92878775009496e-323, 4.94065645841247e-323, 
5.43472210425371e-323, 2.47032822920623e-323, 1.97626258336499e-323, 
5.43472210425371e-323, 5.43472210425371e-323, 4.44659081257122e-323, 
9.38724727098368e-323, 5.92878775009496e-323, 6.91691904177745e-323, 
6.42285339593621e-323, 2.47032822920623e-323, 4.94065645841247e-323, 
8.89318162514244e-323, 4.44659081257122e-323, 8.39911597930119e-323, 
1.08694442085074e-322, 1.33397724377137e-322, 2.02566914794911e-322, 
1.13635098543487e-322, 1.24010477106153e-321, 9.40700989681733e-321, 
1.43279037293961e-322, 1.67982319586024e-322, 1.08694442085074e-322, 
4.44659081257122e-323, 7.90505033345994e-323, 5.92878775009496e-323, 
7.4109846876187e-323, 6.91691904177745e-323, 8.89318162514244e-323, 
5.92878775009496e-323, 9.88131291682493e-323, 7.90505033345994e-323, 
9.38724727098368e-323, 1.18575755001899e-322, 7.4109846876187e-323, 
1.23516411460312e-322, 1.23516411460312e-322, 1.13635098543487e-322, 
1.72922976044436e-322, 1.28457067918724e-322, 1.67982319586024e-322, 
1.72922976044436e-322, 9.38724727098368e-323, 2.12448227711736e-322, 
2.99403781379795e-321, 1.13635098543487e-322, 1.13635098543487e-322, 
7.90505033345994e-323, 8.39911597930119e-323, 9.38724727098368e-323, 
7.4109846876187e-323, 6.91691904177745e-323, 5.92878775009496e-323, 
8.89318162514244e-323, 6.42285339593621e-323, 6.91691904177745e-323, 
1.13635098543487e-322, 7.90505033345994e-323, 1.67982319586024e-322, 
2.27270197086973e-322, 1.87744945419674e-322, 7.90505033345994e-323, 
1.43279037293961e-322, 8.89318162514244e-323, 1.13635098543487e-322, 
1.23516411460312e-322, 1.03753785626662e-322, 1.28457067918724e-322, 
1.03753785626662e-322, 7.4109846876187e-323, 9.88131291682493e-323, 
1.08694442085074e-322, 3.45845952088873e-323, 7.4109846876187e-323, 
4.44659081257122e-323, 4.94065645841247e-323, 3.45845952088873e-323, 
2.96439387504748e-323, 5.43472210425371e-323, 5.43472210425371e-323, 
7.90505033345994e-323, 6.91691904177745e-323, 5.43472210425371e-323, 
7.90505033345994e-323, 8.39911597930119e-323, 7.11454530011395e-322
), class = "integer64")), class = "data.frame", row.names = c(NA, 
-100L))

Как и было предложено, проблема устраняется, если я изменяю соединение на:

db <- DBI::dbConnect(odbc::odbc(), 'my-dns', bigint='numeric');

1 Ответ

0 голосов
/ 05 августа 2020

Похоже, что класс integer64 не работает с функцией hist(). Попробуйте изменить обе переменные на numeri c:

library(dplyr)
data = mutate(data, hour = as.numeric(hour), count = as.numeric(count))

Это работает, хотя выдается предупреждение для hist(data$count):

Предупреждающие сообщения: 1: In pretty.default (range (x), n = breaks, min.n =

  1. : Internal (pretty ()): очень маленький диапазон .. исправлено 2: в plot.window (xlim, ylim, "" , ...): Internal (pretty ()): очень маленький диапазон .. исправлено

Однако это предупреждение, похоже, связано с самими данными.

Кроме того, вы можете попробовать использовать аргумент bigint в dbConnect() со значением «numeri c». Это определяет способ возврата 64-битных целочисленных данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...