我正在使用此工作流程来处理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时,该因子被读为数字,我是正确的。由于以这种方式我对某些数据进行了错误分类,您知道如何避免这个问题?
提前感谢。
由于大型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),但是它对我来说确实有效。任何其他建议或建议将不胜感激。