【发布时间】:2015-02-04 15:52:16
【问题描述】:
我刚刚开始使用 MySQL 来处理当前在 R 数据框对象中的数据。我希望有一个简单的往返 SQL 来准确地重新创建一个 R 数据框:
library("compare",pos=2)
library("RMySQL",pos=2)
conR <- dbConnect(MySQL(),
user = '...',
password = '...',
host = '...',
dbname='r2014')
a3 <- data.frame(x=5:1,y=letters[1:5],z=ordered(c("NEVER","ALWAYS","NEVER","SOMETIMES","NEVER"),levels=c("NEVER","SOMETIMES","ALWAYS")))
a3
dbWriteTable(conn = conR, name = 'a3', value = a3)
a4 <- dbReadTable(conn = conR, name = 'a3')
compare(a3,a4)$detailedResult
a3$z
a4$z
结果显示因子最终以字符串形式出现(y 列和 z 列),有序因子的排序信息丢失了(z 列):
> a3
x y z
1 5 a NEVER
2 4 b ALWAYS
3 3 c NEVER
4 2 d SOMETIMES
5 1 e NEVER
> compare(a3,a4)$detailedResult
x y z
TRUE FALSE FALSE
> a3$z
[1] NEVER ALWAYS NEVER SOMETIMES NEVER
Levels: NEVER < SOMETIMES < ALWAYS
> a4$z
[1] "NEVER" "ALWAYS" "NEVER" "SOMETIMES" "NEVER"
> a3$y
[1] a b c d e
Levels: a b c d e
> a4$y
[1] "a" "b" "c" "d" "e"
在数据库中创建表a3时有没有办法指定有序因子中的信息?
【问题讨论】:
-
在关系数据库中,表表示无序集。除非您在最外层的
select中明确使用order by进行查询,否则您不能依赖查询返回的结果的顺序。 -
@GordonLinoff 问题不在查询结果中,而是 R data.frame 对象存储了一个因子的级别信息,R 中的其他函数可以理解这些信息。我希望将这些信息传输到 dbWriteTable 创建的表中,然后在 dbReadTable 将 data.frame 读回 R 时保留下来。
-
我不认为关系数据库可以轻松地表示同一张表中的排序。我建议创建另一个表来表示排序。它将有两列:因子标签和标签在排序中的排名。
-
目前没有办法无缝地将因素(有序或其他)往返于数据库。
标签: mysql sql r rmysql factors