这与RSQLite 类型转换问题有些相关。
考虑以下示例:
> require(RSQLite)
> DB = dbConnect(RSQLite::SQLite(),":memory:")
> dbSendQuery(DB,"create table tbl (X1 INT, X2 INT)")
> dbSendQuery(DB,"insert into tbl values (1,1),(2,0.1)")
> all.DF <- dbGetQuery(DB,"select *, typeof(X2) from tbl")
> part.DF <- dbGetQuery(DB,"select *, typeof(x2) from tbl where X1 NOT IN (1)")
打电话
> part.DF
给
X1 X2 typeof(x2)
2 0.1 real
但
> all.DF
给
X1 X2 typeof(X2)
1 1 integer
2 0 real
你看到问题了,对吧?在 part.DF 中,第二个值正确为 0.1,而在 all.DF 中,第二个值为 0,尽管类型被正确识别为“真实”!这非常令人困惑 - 类型是正确的,但是从 SQLite 到 R 值 0.1 的某个地方显然变成了整数:
> str(all.DF)
'data.frame': 2 obs. of 3 variables:
$ X1 : int 1 2
$ X2 : int 1 0
$ typeof(X2): chr "integer" "real"
而在 part.DF 中,它被正确地保持为“真实”
> str(part.DF)
'data.frame': 1 obs. of 3 variables:
$ X1 : int 2
$ X2 : num 0.1
$ typeof(x2): chr "real"
为什么?