web-dev-qa-db-fra.com

les doublons 'row.names' ne sont pas autorisés

J'essaye de charger un fichier csv qui a 14 colonnes comme ceci:

StartDate, var1, var2, var3, ..., var14

quand j'émets cette commande:

systems <- read.table("http://getfile.pl?test.csv", header = TRUE, sep = ",")

Je reçois un message d'erreur.

les noms de lignes en double ne sont pas autorisés

Il me semble que le premier nom de colonne est à l'origine du problème. Lorsque je télécharge manuellement le fichier et supprime le nom StartDate du fichier, R lit le fichier et remplace le nom de la première colonne par X. Quelqu'un peut-il me dire ce qui se passe? Le fichier est un fichier csv (séparé par une virgule).

61
george willy

Puis dites à read.table not d'utiliser row.names:

systems <- read.table("http://getfile.pl?test.csv", 
                      header=TRUE, sep=",", row.names=NULL)

et maintenant vos lignes seront simplement numérotées.

Regardez aussi read.csv qui est un wrapper pour read.table qui définit déjà le sep=',' et header=TRUE arguments pour que votre appel se simplifie

systems <- read.csv("http://getfile.pl?test.csv", row.names=NULL)
90
Dirk Eddelbuettel

Cette question connexe souligne une partie du ?read.table documentation qui explique votre problème:

S'il existe un en-tête et que la première ligne contient un champ de moins que le nombre de colonnes, la première colonne de l'entrée est utilisée pour les noms de ligne. Sinon, si row.names est manquant, les lignes sont numérotées.

Votre ligne d'en-tête a probablement 1 colonne de moins que le reste du fichier et donc read.table suppose que la première colonne est row.names (qui doivent tous être uniques), et non une colonne (qui peut contenir des valeurs dupliquées). Vous pouvez résoudre ce problème en utilisant l’une des solutions suivantes:

  1. ajouter un délimiteur (ie \t ou ,) au début ou à la fin de la ligne d’en-tête du fichier source, ou
  2. suppression des délimiteurs de fin dans vos données

Le choix dépendra de la structure de vos données.

Exemple:
Ici, la ligne d'en-tête est interprétée comme comportant une colonne de moins que les données, car les délimiteurs ne correspondent pas:

v1,v2,v3   # 3 items!!
a1,a2,a3,  # 4 items
b1,b2,b3,  # 4 items

Voici comment cela est interprété par défaut:

   v1,v2,v3   # 3 items!!
a1,a2,a3,  # 4 items
b1,b2,b3,  # 4 items

Les valeurs de la première colonne (sans en-tête) sont interprétées sous la forme row.names: a1 et b1. Si cette colonne contient des doublons, ce qui est tout à fait possible, alors vous obtenez le duplicate 'row.names' are not allowed Erreur.

Si vous définissez row.names = FALSE, le décalage n'a pas lieu, mais vous avez toujours un nombre incorrect d'éléments dans l'en-tête et dans les données, car les délimiteurs ne correspondent pas.

Solution 1 Ajoutez un délimiteur de fin à l'en-tête:

v1,v2,v3,  # 4 items!!
a1,a2,a3,  # 4 items
b1,b2,b3,  # 4 items

Solution 2 Supprimez le séparateur final en excès des lignes autres que l'en-tête:

v1,v2,v3   # 3 items
a1,a2,a3   # 3 items!!
b1,b2,b3   # 3 items!!
34
Brian D

J'ai eu cette erreur lors de l'ouverture d'un fichier CSV et l'un des champs contenait des virgules. Le champ était entouré de guillemets et j'avais coupé et collé le read.table avec quote = "". Une fois que j'ai pris quote = "", le comportement par défaut de read.table a pris le dessus et a résolu le problème. Alors je suis parti de ça:

systems <- read.table("http://getfile.pl?test.csv", header=TRUE, sep=",", quote="")

pour ça:

systems <- read.table("http://getfile.pl?test.csv", header=TRUE, sep=",")
1
Odysseus Ithaca

Une autre raison possible de cette erreur est que vous avez des lignes entières dupliquées. Si tel est le cas, le problème est résolu en supprimant les lignes en double.

0
abruin

Dans mon cas, il y avait une virgule à la fin de chaque ligne. En enlevant cela a fonctionné

0
ianaz

Il semble que le problème puisse provenir de plusieurs raisons. Suivre les deux étapes a fonctionné alors que j'avais la même erreur.

  1. J'ai enregistré mon fichier en tant que csv MS-DOS. (Auparavant, il était enregistré uniquement en tant que csv, Excel Starter 2010). Ouvert le csv dans notepad ++. Aucun coma n'était incohérent (cohérence telle que décrite ci-dessus @Brian).
  2. J'ai remarqué que je n'utilisais pas l'argument sep = ",". J'ai utilisé et cela a fonctionné (même si c'est l'argument par défaut!)
0
qqqqq

La réponse ici ( (https://stackoverflow.com/a/22408965/2236315 ) de @adrianoesch devrait aider (par exemple, résout "Si vous connaissez une solution qui ne nécessite pas la solution de contournement maladroite mentionnée dans votre commentaire (décaler les noms des colonnes, copier les données), ce serait formidable. "et" ... demandant que les données soient copiées "proposé par @Frank).

Notez que si vous ouvrez dans un éditeur de texte, vous devriez voir que le nombre de champs d'en-tête est inférieur au nombre de colonnes sous la ligne d'en-tête. Dans mon cas, l'ensemble de données comportait un "," manquant à la fin du dernier champ d'en-tête.

0
ximiki