Comment sauter des lignes invalides lors de la lecture des données d'image à partir du fichier dans le R?
J'ai un gros fichier qui contient beaucoup de données, et j'aimerais lire dans dataframe, mais a trouvé des lignes invalides. Ces lignes invalides cause de la lire.table à casser. J'ai essayer la méthode suivante pour sauter des lignes non valides, mais il semble que le rendement est très mauvais.
counts<-count.fields(textConnection(lines),sep="counts<-count.fields(textConnection(lines),sep="\001")
raw_data<-read.table(textConnection(lines[counts == 34]), sep="\001")
1")
raw_data<-read.table(textConnection(lines[counts == 34]), sep="counts<-count.fields(textConnection(lines),sep="\001")
raw_data<-read.table(textConnection(lines[counts == 34]), sep="\001")
1")
Est-il un meilleur moyen pour y parvenir? Grâce
Ce qui est mauvais dans votre définition?
Une raison quelconque vous n'êtes pas à l'aide de
Une raison quelconque vous n'êtes pas à l'aide de
read.table
directement? Il a beaucoup d'arguments pour sélectionner et d'ignorer divers "mauvais" personnages. Il y a aussi un argument pour "combler" les lignes incomplètes, si tel est le problème que vous rencontrez.OriginalL'auteur zjffdu | 2012-05-15
Vous devez vous connecter pour publier un commentaire.
à l'aide de @PaulHiemstra de l'échantillon de données:
ensuite, vous prenez soin de le NAs comme vous le souhaitez.
Paresseux moi, c'était ma réponse dans mon premier commentaire, mais vous l'avez écrit dans beaucoup plus de détails
pour votre commentaire karma.
Il serait même préférable de le combiner avec
na.string=""
, de cette façon, toutes les cellules vides à être reconnu comme NA.OriginalL'auteur Paolo
Ce que vous pourriez faire est de faire une itération sur les lignes dans le fichier, et ajouter uniquement les lignes qui ont la bonne longueur.
J'ai défini le test suivant fichier csv:
À l'aide de
read.table
échoue:Maintenant une approche itérative:
Bien sûr c'est un exemple trivial que le fichier est vraiment petit. Laissez-nous créer un plus difficile exemple à agir en tant que référence.
Maintenant pour l'indice de référence
Donc l'approche itérative est un peu plus lent, mais 20 secondes pour 1 million de lignes peut être acceptable (bien que cela dépend de votre définition de l'acceptable). Surtout quand vous avez seulement pour cette fois, et de l'enregistrer à l'aide
save
pour une récupération ultérieure. La solution proposée par @Paolo est presque aussi rapide que la normale appel àread.table
. Les lignes qui contiennent le mauvais nombre de colonnes (doncNA
's) sont éliminés à l'aide decomplete.cases
. La spécification des classes les colonnes sont améliore encore les performances, et je pense que cet effet va être plus importante lorsque le nombre de colonnes et de lignes devient plus grande.Donc, en conclusion, la meilleure option est d'utiliser
read.table
avecfill = TRUE
, tout en précisant les catégories de colonnes. L'approche itérative à l'aide deldply
est seulement une bonne option si vous voulez plus de flexibilité dans le choix de la façon de lire les lignes, par exemple, ne lisent que la ligne si une certaine valeur est supérieure à un seuil. Mais, probablement, ce qui pourrait être fait plus rapidement par la lecture de toutes les données dans R, et que la création d'un sous-ensemble. Uniquement lorsque les données est plus grand que votre RAM, je ne pouvais imaginer l'approche itérative avoir ses mérites.OriginalL'auteur Paul Hiemstra