Ich beschäftige mich oft mit unordentlichen Umfragedaten, die eine Menge Aufräumarbeiten erfordern, bevor Statistiken erstellt werden können. Früher habe ich das "manuell" in Excel gemacht, manchmal mit Excel-Formeln und manchmal nacheinander. Ich begann, immer mehr dieser Aufgaben zu erledigen, indem ich Skripte schrieb, um sie in R zu erledigen, was sehr vorteilhaft war (zu den Vorteilen gehörte, dass ich ein Protokoll darüber hatte, was getan wurde, weniger Fehlerwahrscheinlichkeit und in der Lage war, Code wiederzuverwenden, wenn der Datensatz vorhanden war Aktualisiert).
Es gibt jedoch noch einige Datentypen, mit denen ich Probleme habe, effizient umzugehen. Beispielsweise:
> 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
soll die durchschnittliche Anzahl von Stunden pro Tag sein, die für eine bestimmte Aktivität aufgewendet wurden, aber wir haben genau das, was das Thema geschrieben hat. Angenommen, ich entscheide, was mit mehrdeutigen Antworten geschehen soll, und ich möchte die aufgeräumte Variable hours.per.day2
wie folgt.
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
Angenommen, die Anzahl der Fälle ist ziemlich groß (sagen wir 1000) und die Versuchspersonen konnten alles schreiben, was sie wollten. Wie kann man das am besten angehen?
quelle
new_var[by.hand] <- c(2, 1, ...)
mit zuby.hand
seinTRUE
für die Fälle , die von Hand gemacht werden?XML
zu helfen Sie , Daten zu extrahieren, aber das funktioniert nicht, wenn der HTML-@Max's Vorschlag ist gut. Wenn Sie einen Algorithmus schreiben, der sowohl Zahlen als auch gebräuchliche zeitbezogene Wörter / Abkürzungen erkennt, werden Sie den größten Teil des Weges dorthin zurücklegen. Dies wird kein schöner Code sein, aber er wird funktionieren und Sie können ihn im Laufe der Zeit verbessern, wenn Sie auf Problemfälle stoßen.
Versuchen Sie für eine robustere (und anfangs zeitaufwendigere) Vorgehensweise Googeln "Parsen einer Zeitzeichenfolge in natürlicher Sprache". Einige interessante Ergebnisse sind Diese Open- Time-API , ein gutes Python-Modul und einer von vielen wichtigen Threads wie dieser auf Stack Overflow .
Grundsätzlich ist das Parsen natürlicher Sprachen ein häufiges Problem, und Sie sollten nach Lösungen in anderen Sprachen als R suchen. Sie können Tools in einer anderen Sprache erstellen, auf die Sie mit R zugreifen können, oder zumindest gute Ideen für Ihren eigenen Algorithmus erhalten.
quelle
Für so etwas würde ich, wenn es ausreichend lang wäre, eine Liste der regulären Ausdrücke und Transformationsregeln wünschen und die neuen Werte in eine andere Spalte übernehmen (so haben Sie immer die Möglichkeit, die Rohdaten zu überprüfen, ohne sie erneut zu laden). ; Die REs würden so lange auf die noch nicht transformierten Daten angewendet, bis alle Daten transformiert oder alle Regeln erschöpft wären. Am besten ist es wahrscheinlich, eine Liste mit logischen Werten zu führen, aus der hervorgeht, welche Zeilen noch nicht transformiert wurden.
Ein paar solcher Regeln sind natürlich offensichtlich und werden wahrscheinlich 80-90% der Fälle behandeln, aber das Problem ist, dass es immer einige geben wird, von denen Sie nicht wissen, dass sie auftauchen (die Leute sind sehr erfinderisch).
Dann brauchen Sie ein Skript, das die Originale der noch nicht durch die Liste der offensichtlichen Regeln transformierten Werte nacheinander durchläuft und Ihnen die Möglichkeit gibt, einen regulären Ausdruck zu erstellen (sagen wir ), um diese Fälle zu identifizieren und eine neue zu geben Transformation für die passenden Fälle zu erstellen, die der ursprünglichen Liste hinzugefügt und auf die noch nicht transformierten Zeilen des ursprünglichen Vektors angewendet wird, bevor geprüft wird, ob noch Fälle vorhanden sind, die Sie präsentieren können .
Es kann auch sinnvoll sein, die Option zum Überspringen zu haben einen Fall (damit Sie zu einfacheren Fällen übergehen können), damit Sie die sehr schwierigen Fälle bis zum Ende pushen können.
Im schlimmsten Fall machen Sie ein paar von Hand.
Sie können dann die vollständige Liste der von Ihnen generierten Regeln behalten, um sie erneut anzuwenden, wenn die Daten wachsen oder ein neuer, ähnlicher Datensatz hinzukommt.
Ich weiß nicht, ob es sich um eine Best-Practice-Lösung handelt (ich denke, dort wäre etwas viel Formaleres erforderlich), aber im Hinblick auf die schnelle Verarbeitung großer Mengen solcher Daten könnte es von Nutzen sein.
quelle
R enthält einige Standardfunktionen für die Datenmanipulation, die für die Datum Reinigung verwendet werden kann, in seinem Basispaket (
gsub
,transform
, etc.) sowie in verschiedene Fremdpakete, wie stringr , umformen , reshape2 und plyr . Beispiele und Best Practices für die Verwendung dieser Pakete und deren Funktionen sind in folgendem Dokument beschrieben: http://vita.had.co.nz/papers/tidy-data.pdf .Zusätzlich R bietet einige Pakete speziell fokussiert auf Daten Reinigung und Transformation:
Ein umfassender und kohärenter Ansatz für die Datenbereinigung in R, einschließlich Beispielen und Verwendung von Bearbeitungsregeln und deduzierten Paketen sowie eine Beschreibung des Workflows ( Frameworks ) für die Datenbereinigung in R, wird in dem folgenden Dokument vorgestellt, das ich wärmstens empfehle: http : //cran.r-project.org/doc/contrib/de_Jonge+van_der_Loo-Introduction_to_data_cleaning_with_R.pdf .
quelle