es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo obtener el formato correcto de datos para SQLite en R con rtweet?

Tengo problemas para obtener el formato “correcto” de un data.frame:

El objetivo es almacenar un data.frame generado constantemente con rtweet directamente en una base de datos SQLite.

“`{r}
geocode <- c()
con <- dbConnect(RSQLite::SQLite(), “db_name”)
tweets <- as.data.frame(c())

for (i in geocode){
tweets <- search_tweets(geocode = geocode, n = 18000, retryonratelimit = T, include_rts = F)
dbWriteTable(con, “tweets”, tweets, append = T)
}


Este código me da el siguiente error:

Error: Solo se pueden enlazar listas de vectores de tipo “raw” (o NULL)


El formato de los datos es:

class(tweets)
[1] “tbl_df” “tbl” “data.frame”


Cuando exporto los datos con `fwrite()` a `.csv` e importo todo mediante `read.csv2`, `dbWriteTable()` funciona perfectamente: ```{r} df <- read.csv2("FILE_NAME/tweets.csv", header = T, sep = ",") dbWriteTable(con, "tweets", df, append = T)

Y el formato de df aquí es:

> class(df)
[1] "data.frame"

Pero usar fwrite y read.csv2 no es una opción ya que mi data.frame será demasiado grande para la memoria de R.

Simplemente utilizar as.data.frame() tampoco funciona. Aunque ahora es un data.frame…

> class(as.data.frame(tweets))
[1] "data.frame"

Debe haber otra forma de obtener el formato correcto.

¡Muchas gracias de antemano por cualquier ayuda!

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El problema aquí parece ser que as.data.frame() no convierte correctamente el objeto tbl_df en un objeto data.frame regular que se pueda almacenar en SQLite. Una posible solución es convertir el objeto tbl_df en un objeto matrix, que luego se puede convertir en un objeto data.frame regular utilizando la función as.data.frame(). Aquí hay una versión actualizada del código que utiliza este enfoque:

    geocode <- c()
    con <- dbConnect(RSQLite::SQLite(), "nombre_db")
    
    for (i in geocode){
      tweets <- search_tweets(geocode = geocode, n = 18000, retryonratelimit = T, include_rts = F)
      tweets_mat <- as.matrix(tweets)
      tweets_df <- as.data.frame(tweets_mat)
      dbWriteTable(con, "tweets", tweets_df, append = T)
    }
    

    En esta versión del código, primero convertimos el objeto tbl_df tweets en un objeto matrix utilizando as.matrix(). Luego convertimos el objeto matrix en un data.frame regular utilizando as.data.frame(), lo cual debería crear un objeto data.frame que se puede almacenar en SQLite utilizando dbWriteTable().

Comments are closed.