web-dev-qa-db-fra.com

read.csv contre read.table

J'ai vu dans plusieurs cas que, bien que read.table() ne puisse pas lire un fichier délimité par des tabulations (par exemple, le tableau d'annotation d'un microréseau) renvoyant l'erreur suivante:

Error in scan(file, what, nmax, sep, dec, quote, skip, nlines, na.strings,  : 
line xxx did not have yyy elements

read.csv() fonctionne parfaitement sur le même fichier sans erreur. Je pense aussi que la vitesse de read.csv() est également supérieure à read.table()

Encore plus: read.table() est très fou en lisant un fichier de moi. Il commet cette erreur lors de la lecture de la ligne 100, mais lorsque je copie-colle les lignes 90 à 110 juste après l'en-tête du même fichier, il génère toujours l'erreur des lignes 100 + 21 (nouvelles lignes copiées au début). S'il y a un problème avec cette ligne, pourquoi ne rapporte-t-il pas cette erreur lors de la lecture de la ligne collée au début? Je confirme que read.csv() lit le même fichier sans erreur.

Avez-vous une idée de la raison pour laquelle read.table() est incapable de lire les mêmes fichiers sur lesquels read.csv() fonctionne? De plus, y a-t-il une raison d'utiliser read.table() dans tous les cas?

16
Ali

read.csv est un wrapper assez fin autour de read.table; Je serais très surpris si vous ne pouviez pas reproduire exactement le comportement de read.csv en fournissant les arguments corrects à read.table. Cependant, certains de ces arguments (tels que la façon dont les guillemets ou les caractères de commentaire sont traités) pourraient bien changer la vitesse et le comportement de la fonction.

En particulier, c'est la full définition de read.csv:

function (file, header = TRUE, sep = ",", quote = "\"", dec = ".", 
    fill = TRUE, comment.char = "", ...) {
     read.table(file = file, header = header, sep = sep, quote = quote, 
        dec = dec, fill = fill, comment.char = comment.char, ...)
}

comme indiqué, il s'agit simplement de read.table avec un ensemble particulier d'options.

Comme @Chase l'indique dans les commentaires ci-dessous, la page d'aide pour read.table() en dit autant sous Details

read.csv et read.csv2 sont identiques à read.table à l'exception des valeurs par défaut. Ils sont destinés à la lecture de fichiers «valeurs séparées par des virgules» («.csv») ou (read.csv2) par le variant utilisé dans les pays qui utilisent une virgule comme point décimal et un point-virgule comme séparateur de champ.

28
Ben Bolker

N'utilisez pas read.table pour lire des fichiers délimités par des tabulations, utilisez read.delim. (C’est juste une mince couche autour de read.table mais les options sont définies avec les valeurs appropriées)

9
hadley

read_table() échoue parfois sur l'onglet sep 'ed fichier et la définition de sep='\s+' peut aider à supposer que les éléments de votre table ne disposent pas d'espace.

0
user3760541