J'essaie d'importer mon jeu de données dans R en utilisant read.table()
:
Dataset.df <- read.table("C:\\dataset.txt", header=TRUE)
Mais je reçois le message d'erreur suivant:
Error in scan(file, what, nmax, sep, dec, quote, skip, nlines, na.strings, :
line 1 did not have 145 elements
Qu'est-ce que cela signifie et comment puis-je résoudre ce problème?
Cette erreur est assez explicite. Il semble y avoir des données manquantes dans la première ligne de votre fichier de données (ou dans la deuxième ligne, selon le cas, puisque vous utilisez header = TRUE
).
Voici un mini exemple:
## Create a small dataset to play with
cat("V1 V2\nFirst 1 2\nSecond 2\nThird 3 8\n", file="test.txt")
R détecte automatiquement qu'il doit s'attendre à des noms de fichiers plus deux colonnes (3 éléments), mais il ne trouve pas 3 éléments sur la ligne 2, vous obtenez donc une erreur:
read.table("test.txt", header = TRUE)
# Error in scan(file, what, nmax, sep, dec, quote, skip, nlines, na.strings, :
# line 2 did not have 3 elements
Regardez le fichier de données et voyez s'il y a effectivement un problème:
cat(readLines("test.txt"), sep = "\n")
# V1 V2
# First 1 2
# Second 2
# Third 3 8
Une correction manuelle peut être nécessaire, ou nous pouvons supposer que la première valeur de la deuxième ligne doit être dans la première colonne et que les autres valeurs doivent être NA
. Si tel est le cas, fill = TRUE
suffit à résoudre votre problème.
read.table("test.txt", header = TRUE, fill = TRUE)
# V1 V2
# First 1 2
# Second 2 NA
# Third 3 8
R est également assez intelligent pour comprendre combien d’éléments sont nécessaires même s’il manque des noms de domaine:
cat("V1 V2\n1\n2 5\n3 8\n", file="test2.txt")
cat(readLines("test2.txt"), sep = "\n")
# V1 V2
# 1
# 2 5
# 3 8
read.table("test2.txt", header = TRUE)
# Error in scan(file, what, nmax, sep, dec, quote, skip, nlines, na.strings, :
# line 1 did not have 2 elements
read.table("test2.txt", header = TRUE, fill = TRUE)
# V1 V2
# 1 1 NA
# 2 2 5
# 3 3 8
En rencontrant cette erreur et en examinant mon ensemble de données qui ne semblait contenir aucune donnée manquante, j'ai découvert que quelques-unes de mes entrées avaient le caractère spécial "#" qui a empêché l'importation des données. Une fois que j'ai supprimé le "#" des cellules incriminées, les données ont été importées sans problème.
J'ai rencontré ce problème lors de l'importation dans R de certains des fichiers Add Health Data (voir: http://www.icpsr.umich.edu/icpsrweb/ICPSR/studies/21600?archive=ICPSR&q=21600 ) Par exemple, la commande suivante pour lire le fichier de données DS12 au format .tsv séparé par des tabulations générera l'erreur suivante:
ds12 <- read.table("21600-0012-Data.tsv", sep="\t", comment.char="",
quote = "\"", header=TRUE)
Error in scan(file, what, nmax, sep, dec, quote, skip, nlines,
na.strings, : line 2390 did not have 1851 elements
Il semble qu'il y ait un léger problème de formatage avec certains des fichiers qui provoque le rejet du fichier par R. Au moins une partie du problème semble être l'utilisation occasionnelle de guillemets doubles au lieu d'une apostrophe qui provoque un nombre impair de caractères de guillemets doubles dans une ligne.
Après avoir tripoté, j'ai identifié trois solutions possibles:
Ouvrez le fichier dans un éditeur de texte et recherchez/remplacez toutes les occurrences d'un caractère guillemet "par rien. En d'autres termes, supprimez toutes les guillemets doubles. Pour ces données délimitées par des tabulations, cela signifiait simplement que certains extraits textuels de commentaires de sujets ne plus longtemps entre guillemets, ce qui n’était pas un problème pour l’analyse de mes données.
Avec les données stockées sur ICPSR (voir lien ci-dessus) ou d'autres archives, une autre solution consiste à télécharger les données dans un nouveau format. Dans ce cas, une bonne option consiste à télécharger la version Stata de la DS12, puis à l'ouvrir à l'aide de la commande read.dta comme suit:
library(foreign)
ds12 <- read.dta("21600-0012-Data.dta")
Une solution connexe/hack consiste à ouvrir le fichier .tsv dans Excel et à le réenregistrer en tant que fichier texte séparé par des tabulations. Cela semble effacer tout problème de formatage qui rend R malheureux.
Aucune de celles-ci n'est idéale car elles ne résolvent pas tout à fait le problème de R avec le fichier .tsv d'origine, mais les conflits de données nécessitent souvent l'utilisation de plusieurs programmes et formats.
Si vous utilisez linux et que le fichier de données provient de windows . C'est probablement parce que le caractère ^ M Trouvez-le et supprimez .
Pour les autres qui ne peuvent pas trouver de solution et savent que les données ne manquent pas d'éléments:
J'ai ce problème lorsque j'utilise Excel 2013 pour enregistrer des fichiers au format .csv, puis j'essaie de les charger dans R à l'aide de read.table (). La solution que j'ai trouvée consiste à coller les données directement d'Excel dans un document .txt, puis à les ouvrir avec:
read.table(file.choose(), sep="\t").
J'espère que ça aide.
Outre toutes les indications mentionnées ci-dessus, vous pouvez également vérifier toutes les données.
S'il y a des espaces entre les mots, vous devez les remplacer par "_"
.
Cependant, c'est comme ça que je résous mon propre problème.
Le symbole de hachage #
créant cette erreur, si vous pouvez supprimer le #
du début du nom de la colonne, cela pourrait résoudre le problème.
Fondamentalement, lorsque le nom de la colonne commence par #
entre les lignes, read.table()
sera reconnu comme point de départ pour cette ligne.
J'ai rencontré cette erreur lorsque j'avais un paramètre row.names = "id" (selon le tutorial ) avec une colonne nommée "id".