繁体   English   中英

从数据库中检索的列必须转换为数字才能使用

[英]Column retrieved from database must be cast to numeric to be usable

如果我从数据库(带有 RMariaDB 或 ODBC 的 MySQL 数据库)中检索数据,则在使用多个 R 函数(hist、boxplot,但不是 sd 或摘要)按原样使用数据时会出错:

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 一切正常,否则如果我想使用数据库中的数据,我必须将其转换为数字。

根据要求,代码:

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

输入 output:

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');

似乎 class “integer64” 不适用于hist() function。 尝试将两个变量都修改为数字:

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

这有效,尽管为hist(data$count)引发了警告:

警告信息: 1:在 pretty.default(range(x), n = breaks, min.n =

  1. :内部(漂亮()):非常小的范围..更正2:在plot.window(xlim,ylim,“”,...):内部(漂亮()):非常小的范围..更正

不过,此警告似乎与数据本身有关。

此外,您可以尝试使用将dbConnect()中的bigint参数设置为“numeric”。 这决定了如何返回 64 位 integer 数据。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM