Mutate 函数将值向下舍入,为什么?

问题描述

我从 this 课程中学习了数据库,并尝试用它执行一些操作。这是我的代码

install.packages(c("dbplyr","Rsqlite"))
dir.create("data_raw",showWarnings = FALSE)
download.file(url = "https://ndownloader.figshare.com/files/2292171",destfile = "data_raw/portal_mammals.sqlite",mode = "wb")
library(dplyr)
library(dbplyr)
mammals <- DBI::dbConnect(Rsqlite::sqlite(),"data_raw/portal_mammals.sqlite")
test <- tbl(mammals,"surveys")%>%
        select(record_id,month)%>%
        mutate(ratio=record_id/month)
test

我不明白为什么“比率”变量被四舍五入了。有人能解释一下吗?

解决方法

我的猜测是,您要计算的列 record_idmonth 是整数类型。这意味着答案是以整数类型返回的,因此它会向下舍入/丢弃小数位。

不,这不是默认的 R 行为。但这是默认的数据库行为。为什么这很重要?使用 dbplyr 时,计算不是在 R 中完成,而是从 R 转换为 SQL 并在数据库中执行。

解决方法很简单:用小数 1.0 开始计算:

test <- tbl(mammals,"surveys")%>%
        select(record_id,month)%>%
        mutate(ratio = 1.0 * record_id / month)

这是有效的,因为 11.0 与数据库不同。 1 是整数类型,1.0 是十进制类型。因为现在比率的计算以小数开头,所以现在应该返回小数。