web-dev-qa-db-fra.com

Enregistrement et chargement de data.frames

J'ai créé une trame de données basée sur un ensemble de twitters sous la forme suivante:

 rdmTweets <- userTimeline("rdatamining", n=200)
 df <- do.call("rbind", lapply(rdmTweets, as.data.frame))

Maintenant, je sauvegarde la trame de données avec save de cette façon:

 save(df, file="data")

Comment puis-je charger cette trame de données enregistrée pour une utilisation future? Quand j'utilise:

  df2 <- load("data")

et j'applique dim(df2) il devrait renvoyer la quantité de tweets que le bloc de données a, mais il n'affiche que 1.

24
Layla

Comme le souligne @mrdwab, save enregistre les noms ainsi que les données/structure (et peut en fait enregistrer un certain nombre d'objets R différents dans un seul fichier). Il existe une autre paire de fonctions de stockage qui se comportent plus comme prévu. Essaye ça:

saveRDS(df, file="mytweets.rds")
df2 <- readRDS("mytweets.rds")

Ces fonctions ne peuvent gérer qu'un seul objet à la fois.

39
seancarmody

Une autre option consiste à enregistrer votre bloc de données en tant que fichier csv. L'avantage de cette option est qu'elle fournit à long terme stockage, c'est-à-dire que vous pourrez (probablement) ouvrir votre fichier csv sur n'importe quelle plate-forme dans dix ans. Avec un fichier RData, vous ne pouvez l'ouvrir qu'avec R et je ne voudrais pas miser de l'argent sur son ouverture entre les versions.

Pour enregistrer le fichier au format csv, utilisez simplement: read.csv et write.csv, donc:

write.csv(df, file="out.csv", row.name=FALSE)
df = read.csv("out.csv", header=TRUE)

Le commentaire de Gavin ci-dessous a soulevé quelques points:

L'itinéraire CSV ne fonctionne que pour les données de style tabulaire.

Complètement correct. Mais si vous enregistrez une trame de données (comme l'OP), vos données sont sous forme de tableau.

Avec R, vous aurez toujours la possibilité de lancer une ancienne version pour lire les données et les exporter si, pour une raison quelconque, elles changent de format d'enregistrement et ne permettent pas à l'ancien format d'être chargé par une autre fonction.

Pour jouer à l'adovacate du diable, vous pouvez utiliser cet argument avec Excel et enregistrer vos données sous la forme d'un xls. Cependant, enregistrer vos données au format csv signifie que nous n'avons jamais à nous en préoccuper.

Le format de fichier de R est documenté afin que l'on puisse raisonnablement facilement lire les données binaires dans un autre système en utilisant ces informations ouvertes.

Je suis complètement d'accord - bien que "facilement" soit un peu fort. C'est pourquoi l'enregistrement en tant que fichier RData n'est pas si grave. Mais si vous enregistrez des données tabulaires, pourquoi ne pas utiliser un fichier csv?

Pour mémoire, il existe certaines raisons pour enregistrer les données tabulaires en tant que fichier RData. Par exemple, la vitesse de lecture/écriture du fichier ou de la taille du fichier.

13
csgillespie

save enregistre le nom de l'ensemble de données ainsi que les données. Ainsi, vous ne devez pas attribuer de nom à load("data") et tout devrait bien se passer. En d'autres termes, utilisez simplement:

load("data")

et il chargera un objet nommé df (ou tout ce qui est contenu dans le fichier "data") dans votre espace de travail actuel.

Je suggérerais cependant un nom plus original pour votre fichier et envisagerais d'ajouter une extension pour vous aider à vous souvenir de vos fichiers de script, de vos fichiers de données, etc.


Parcourez cet exemple simple:

rm(list = ls())              # Remove everything from your current workspace
ls()                         # Anything there? Nope.
# character(0)
a <- 1:10                    # Create an object "a"
save(a, file="myData.Rdata") # Save object "a"
ls()                         # Anything there? Yep.
# [1] "a"
rm(a)                        # Remove "a" from your workspace
ls()                         # Anything there? Nope.
# character(0)
load("myData.Rdata")         # Load your "myData.Rdata" file
ls()                         # Anything there? Yep. Object "a".
# [1] "a"
str(a)                       # Is "a" what we expect it to be? Yep.
#  int [1:10] 1 2 3 4 5 6 7 8 9 10
a2 <- load("myData.Rdata")   # What about your approach?
ls()                         # Now we have 2 objects
# [1] "a"  "a2"
str(a2)                      # "a2" stores the object names from your data file.
#  chr "a"

Comme vous pouvez le voir, save vous permet d'enregistrer et de charger plusieurs objets à la fois, ce qui peut être pratique lorsque vous travaillez sur des projets avec plusieurs ensembles de données que vous souhaitez conserver ensemble.

D'un autre côté, saveRDS (de la réponse acceptée ) vous permet uniquement d'enregistrer des objets uniques. À certains égards, c'est plus "transparent" puisque load() ne vous permet pas de prévisualiser le contenu du fichier sans d'abord le charger.

10