CSV到R中的SQLite(dbWriteTable):传递因子

问题描述 投票:0回答:1

我正在使用此工作流程来处理R中的大型csv文件:

library(sqldf)

csv <- "db.csv"
sqlite_file <- "db.sqlite"
table_name <- "table"

db <- src_sqlite(sqlite_file, create = TRUE)
con <- dbConnect(SQLite(), dbname = sqlite_file)
dbWriteTable(con, name=table_name, value=csv, 
             row.names=FALSE, header=TRUE, sep = ",", overwrite = TRUE)

然后创建查询,获取数据,依此类推。数据将如下所示:

ID     Class     V1   V2   V3 ...
1      1.1       100  234  423
2      5         221  345  563
3      2.2.2     240  356  250
4      3.1       267  569  867
5      6         125  469  596

原始.csv文件中的Class列是具有以下10个级别的因子:

"1.1"   "1.2"   "2.1"   "2.2.1" "2.2.2" "3.1"   "3.2"   "4"     "5"     "6"

但是,一旦将csv文件传递给sqlite并将其取回R,该因数就会失去其两个层次:

"1.1" "1.2" "2.1" "2.2" "3.1" "3.2" "4"   "5"   "6" 

我以为,当将csv传递给sqlite时,该因子被读为数字,我是正确的。由于以这种方式我对某些数据进行了错误分类,您知道如何避免这个问题?

提前感谢。

r csv sqldf
1个回答
0
投票

由于大型csv只是先前处理的产品,我通过简单地导入另一个仅包含ID和类的csv来解决。

通过SQL语句获取数据后,我通过data.table强制转换了数据帧,并通过以下方式通过更新联接来解决:

tags <- fread("ID_class.csv")

df <- dbFetch(query)
df <- data.table(df)
df$Class <- as.character(df$Class)
df <- df[tags, on=.(ID), Class := i.Class]
df$Class <- factor(df$Class)

这不是最优雅的方法,也不是最有效的(您需要具有正确类的先前的csv),但是它对我来说确实有效。任何其他建议或建议将不胜感激。

© www.soinside.com 2019 - 2024. All rights reserved.