Je traite souvent des données d'enquête en désordre qui nécessitent beaucoup de nettoyage avant de pouvoir effectuer des statistiques. J'avais l'habitude de le faire "manuellement" dans Excel, parfois en utilisant des formules Excel, et parfois en vérifiant les entrées une par une. J'ai commencé à faire de plus en plus de ces tâches en écrivant des scripts pour les faire dans R, ce qui a été très bénéfique (les avantages incluent avoir un enregistrement de ce qui a été fait, moins de risques d'erreurs et pouvoir réutiliser du code si l'ensemble de données est mis à jour).
Mais il existe encore certains types de données que j'ai du mal à gérer efficacement. Par exemple:
> d <- data.frame(subject = c(1,2,3,4,5,6,7,8,9,10,11),
+ hours.per.day = c("1", "2 hours", "2 hr", "2hr", "3 hrs", "1-2", "15 min", "30 mins", "a few hours", "1 hr 30 min", "1 hr/week"))
> d
subject hours.per.day
1 1 1
2 2 2 hours
3 3 2 hr
4 4 2hr
5 5 3 hrs
6 6 1-2
7 7 15 min
8 8 30 mins
9 9 a few hours
10 10 1 hr 30 min
11 11 1 hr/week
hours.per.day
est censé être le nombre moyen d'heures par jour consacrées à une certaine activité, mais ce que nous avons est exactement ce que le sujet a écrit. Supposons que je prenne certaines décisions sur ce qu'il faut faire avec des réponses ambiguës, et que je veux la variable rangée hours.per.day2
comme suit.
subject hours.per.day hours.per.day2
1 1 1 1.0000000
2 2 2 hours 2.0000000
3 3 2 hr 2.0000000
4 4 2hr 2.0000000
5 5 3 hrs 3.0000000
6 6 1-2 1.5000000
7 7 15 min 0.2500000
8 8 30 mins 0.5000000
9 9 a few hours 3.0000000
10 10 1 hr 30 min 1.5000000
11 11 1 hr/week 0.1428571
En supposant que le nombre de cas est assez important (disons 1000) et sachant que les sujets étaient libres d'écrire ce qu'ils voulaient, quelle est la meilleure façon d'aborder cela?
la source
new_var[by.hand] <- c(2, 1, ...)
avecby.hand
êtreTRUE
pour les cas qui sont faites à la main?XML
pour vous aider à extraire des données, mais cela ne fonctionne pas lorsque le HTML est mal formé.)La suggestion de @ Max est bonne. Il semble que si vous écrivez un algorithme qui reconnaît les nombres ainsi que les mots / abréviations associés au temps, vous obtiendrez la plupart du chemin. Ce ne sera pas un beau code, mais cela fonctionnera et vous pouvez l'améliorer au fil du temps lorsque vous rencontrez des cas problématiques.
Mais pour une approche plus robuste (et qui prend du temps au départ), essayez de googler «analyser une chaîne temporelle en langage naturel». Certaines découvertes intéressantes sont cette API temps ouvert , un bon module Python et l'un des nombreux threads pertinents comme celui-ci sur Stack Overflow .
Fondamentalement, l'analyse syntaxique en langage naturel est un problème commun et vous devez rechercher des solutions dans des langues autres que R. Vous pouvez créer des outils dans une autre langue à laquelle vous pouvez accéder à l'aide de R, ou à tout le moins, vous pouvez obtenir de bonnes idées pour votre propre algorithme.
la source
Pour quelque chose comme ça, s'il était suffisamment long, je pense que je voudrais une liste d'expressions régulières et de règles de transformation, et prendre les nouvelles valeurs dans une autre colonne (donc vous avez toujours la possibilité de vérifier à nouveau sans recharger les données brutes) ; les ER seraient appliqués pour les données pas encore transformées jusqu'à ce que toutes les données soient transformées ou que toutes les règles soient épuisées. Il est probablement préférable de conserver également une liste de valeurs logiques qui indiquent quelles lignes n'ont pas encore été transformées.
Bien sûr, quelques règles de ce type sont évidentes et gèreront probablement 80 à 90% des cas, mais le problème est qu'il y en aura toujours dont vous ne savez pas qu'elles apparaîtront (les gens sont très inventifs).
Ensuite, vous avez besoin d'un script qui passe en revue et vous présente les originaux des valeurs de règles non encore transformées par la liste des règles évidentes, vous donnant la possibilité de faire une expression régulière (disons ) pour identifier ces cas et donner une nouvelle transformation pour les cas qui lui correspondent, qu'il ajoute à la liste d'origine et s'applique aux lignes non encore transformées du vecteur d'origine avant de vérifier s'il reste des cas à vous présenter .
Il peut également être raisonnable d'avoir l'option d' ignorer un cas (afin que vous puissiez passer aux plus faciles), afin de pouvoir pus les cas très durs jusqu'à la fin.
Pire cas, vous en faites quelques-uns à la main.
Vous pouvez ensuite conserver la liste complète des règles que vous générez, pour les appliquer à nouveau lorsque les données augmentent ou qu'un nouvel ensemble de données similaire arrive.
Je ne sais pas si cela s'approche à distance des meilleures pratiques (je pense que quelque chose de beaucoup plus formel serait nécessaire là-bas), mais en termes de traitement rapide de grandes quantités de ces données, cela pourrait avoir une certaine valeur.
la source
R contient des standards fonctions pour la manipulation de données, qui peuvent être utilisés pour le nettoyage des données, dans sa base de paquet (
gsub
,transform
, etc.), ainsi que dans divers logiciels tiers, tels que stringr , Reshape , reshape2 et plyr . Des exemples et les meilleures pratiques d'utilisation de ces packages et de leurs fonctions sont décrits dans le document suivant: http://vita.had.co.nz/papers/tidy-data.pdf .De plus, R propose des packages spécifiquement axés sur le nettoyage et la transformation des données:
Une approche complète et cohérente du nettoyage des données dans R, y compris des exemples et l'utilisation de règles d' édition et de packages de déduplication , ainsi qu'une description du flux de travail ( cadre ) du nettoyage des données dans R, est présentée dans le document suivant, que je recommande fortement: http : //cran.r-project.org/doc/contrib/de_Jonge+van_der_Loo-Introduction_to_data_cleaning_with_R.pdf .
la source