#r #loops
#r #циклы
Вопрос:
Я пытаюсь импортировать несколько файлов .db3 и повторно связать их вместе для дальнейшего анализа. У меня нет проблем с импортом одного файла .db3, но мой rbind не будет работать, несмотря на то, что он отлично работает для файлов .csv. Где я ошибся?
df <- c()
for (x in list.files(pattern="*.db3")){
sqlite <- dbDriver("SQLite")
mydb <- dbConnect(sqlite, x)
dbListTables(mydb)
results <- dbSendQuery(mydb, "SELECT * FROM gps_data")
data = fetch(results, n = -1)
data$Label <- factor(x)
data <- rbind(df, data)
}
Любая помощь, которую вы можете предложить, была бы отличной!
Комментарии:
1. Как происходит сбой? Возвращает ли он ошибку?
2. Могут быть хорошие идеи: 1) закрыть соединения после использования 2)
sqlite <- dbDriver("SQLite")
использовать перед циклом
Ответ №1:
Давайте внимательно рассмотрим этот rbind
вызов в конце вашего цикла:
df <- c()
for (x in list.files(pattern="*.db3")){
sqlite <- dbDriver("SQLite")
mydb <- dbConnect(sqlite, x)
dbListTables(mydb)
results <- dbSendQuery(mydb, "SELECT * FROM gps_data")
data = fetch(results, n = -1)
data$Label <- factor(x)
data <- rbind(df, data)
}
Вы создали объект df
, затем вы привязываете data
его к концу и используете его для переопределения существующего data
(примечание df
не изменилось). Отлично. Теперь ваш цикл начинается снова, создавая новый data
объект и привязывая его к …. df
. Doh! Это простая ошибка, но вы связываете вещи в неправильном порядке. Попробуйте изменить эту последнюю строку на:
df <- rbind( df, data )
и посмотрите, как это происходит.
То, что вы будете делать по-другому, это перезаписывать df
снова и снова, увеличивая его каждый раз. Когда вы перезаписывали data
, вы возвращались и воссоздавали его заново, отбрасывая то, что вы только что сделали.
Комментарии:
1. Спасибо за это! Я попытался изменить порядок данных и df безрезультатно. Я думаю, что вы правы, потому что выходные данные показывают только данные для одного файла, который всегда является последним файлом в алфавитном порядке в рабочем каталоге (т. Е. Они перезаписывают друг друга).). Есть ли какой-то другой способ, которым я перезаписал себя?
2. Этого я здесь не вижу. Может быть, вы могли бы включить минимальный воспроизводимый пример, чтобы мы могли понять, в чем проблема?
3. Я не понимаю, что вы подразумеваете под минимальным воспроизводимым примером, это весь код, и у меня есть три файла .db3 в рабочем каталоге. Хотите, чтобы я загрузил эти файлы?
4. Нашел свою проблему — я пытался записать новые данные поверх самих себя, а не записывать «данные» в «df»