Циклический код для нескольких файлов db3 в R

#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»