Я часто имею дело с грязными данными опросов, которые требуют большой очистки, прежде чем можно будет сделать какую-либо статистику. Я делал это вручную в Excel, иногда используя формулы Excel, а иногда проверял записи по одному. Я начал выполнять все больше и больше этих задач, написав сценарии для их выполнения на языке R, что было очень полезно (преимущества включают в себя запись того, что было сделано, меньшую вероятность ошибок и возможность повторного использования кода, если набор данных обновлено).
Но есть все еще некоторые типы данных, с которыми у меня возникают проблемы при эффективной обработке. Например:
> 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
подразумевается среднее количество часов в день, потраченных на определенную деятельность, но мы имеем именно то, что написал субъект. Предположим, я принимаю некоторые решения о том, что делать с неоднозначными ответами, и я хочу, чтобы приведенная переменная была hours.per.day2
следующей.
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
Если предположить, что количество дел достаточно велико (скажем, 1000), и зная, что испытуемые могут свободно писать все, что им нравится, как лучше всего подойти к этому?
источник
new_var[by.hand] <- c(2, 1, ...)
сby.hand
того ,TRUE
за исключением случаев , которые сделаны вручную?XML
которые помогут вам извлечь данные, но это не работает, когда HTML искажен.)Предложение @ Макса хорошее. Кажется, что если вы напишите алгоритм, который распознает числа, а также общие слова / сокращения, связанные со временем, вы получите большую часть пути. Это не будет красивый код, но он будет работать, и вы сможете со временем его улучшить, если столкнетесь с проблемами.
Но для более надежного (и изначально трудоемкого) подхода попробуйте поискать в Google «разбор строки времени на естественном языке». Вот некоторые интересные результаты: это API открытого времени , хороший модуль Python и один из многих немецких потоков, подобных этому, в Stack Overflow .
По сути, разбор естественного языка является распространенной проблемой, и вы должны искать решения на языках, отличных от R. Вы можете создавать инструменты на другом языке, к которому у вас есть доступ, используя R, или, по крайней мере, вы можете получить хорошие идеи для своего собственного алгоритма.
источник
Для чего-то подобного, если бы оно было достаточно длинным, я бы хотел получить список регулярных выражений и правил преобразования и перенести новые значения в другой столбец (чтобы у вас всегда была возможность дважды проверить, не перезагружая необработанные данные). ; RE будут применяться для не слишком далеко преобразованных данных, пока все данные не будут преобразованы или все правила не будут исчерпаны. Вероятно, лучше также сохранить список логических значений, которые указывают, какие строки еще не были преобразованы.
Несколько таких правил, конечно, очевидны и, вероятно, будут обрабатывать 80-90% случаев, но проблема в том, что всегда найдутся те, о которых вы не знаете (люди очень изобретательны).
Затем вам нужен сценарий, который просматривает и представляет вам оригиналы значений, которые еще не были преобразованы списком очевидных правил, по одному, давая вам возможность сделать регулярное выражение (скажем, ) идентифицировать эти случаи и дать новое преобразование для подходящих ему случаев, которые оно добавляет к исходному списку и применяет к еще не преобразованным строкам исходного вектора, прежде чем проверять, есть ли еще случаи, чтобы представить их вам ,
Также было бы разумно иметь возможность пропустить дело (чтобы вы могли перейти к более легким), чтобы вы могли перенести очень сложные дела до конца.
В худшем случае, вы делаете несколько вручную.
Затем вы можете сохранить полный список сгенерированных вами правил, чтобы их можно было применять снова, когда объем данных увеличивается или появляется новый аналогичный набор данных.
Я не знаю, приближается ли это к наилучшей практике (я думаю, что там понадобится что-то гораздо более формальное), но с точки зрения быстрой обработки больших объемов таких данных это может иметь определенную ценность.
источник
R содержит некоторые стандартные функции для манипулирования данными, которые могут быть использованы для очистки данных, в базовом пакете (
gsub
,transform
и т.д.), а также в различные пакеты сторонних разработчиков , такие как stringr , перекроить , reshape2 и plyr . Примеры и лучшие практики использования этих пакетов и их функций описаны в следующей статье: http://vita.had.co.nz/papers/tidy-data.pdf .Кроме того, R предлагает некоторые пакеты специально сосредоточены на очистке и преобразования данных:
Комплексный и согласованный подход к очистке данных в R, включая примеры и использование правил редактирования и дедуктивных пакетов, а также описание рабочего процесса ( каркаса ) очистки данных в R, представлен в следующей статье, которую я настоятельно рекомендую: http : //cran.r-project.org/doc/contrib/de_Jonge+van_der_Loo-Introduction_to_data_cleaning_with_R.pdf .
источник