CSV в SQLite в R (dbWriteTable): факторы прохождения - PullRequest
0 голосов
/ 11 апреля 2020

Я использую этот рабочий процесс для обработки большого CSV-файла в R:

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

Столбец Class в исходном файле .csv является фактором со следующими 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 фактор читался как число, и я был прав. Поскольку таким образом я неправильно классифицирую некоторые данные, знаете ли вы, как можно избежать этой проблемы?

Заранее спасибо.

1 Ответ

0 голосов
/ 12 апреля 2020

Поскольку большой CSV был только продуктом предыдущей обработки, я решил просто импортировать другой CSV, который содержал только идентификаторы и классы.

После выборки данных с помощью оператора SQL я произвел Dataframe от 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 с правильными классами), но он работал для меня в этом вопросе. Любой другой совет или предложение будут оценены.

...