Как обрабатывать пустые элементы при преобразовании дат в R

У меня есть CSV-загрузка данных из системы управленческой информации. Есть некоторые переменные, которые являются датами и записываются в CSV в виде строк в формате «2012/11/16 00:00:00».

После прочтения файла csv я конвертирую переменные даты в дату с помощью функции as.Date (). Это отлично работает для всех переменных, не содержащих пустых элементов.

Для тех, которые действительно содержат пустые элементы, я получаю следующее сообщение об ошибке: «строка символов не в стандартном однозначном формате»

Как я могу заставить R заменить пустые элементы чем-то вроде «0000/00/00 00:00:00», чтобы функция as.Date () не прерывалась? Вы могли бы порекомендовать другие подходы?


person Tyler Durden    schedule 29.11.2012    source источник
comment
as.Date(c("2012/11/16 00:00:00",NA)) у меня работает нормально, поэтому я предполагаю, что в этих пустых полях у вас есть что-то кроме НА. Вероятно, было бы лучше заменить эти пустые поля на НП. Не могли бы вы опубликовать часть своих данных с помощью dput()?   -  person Stephan Kolassa    schedule 29.11.2012
comment
У данных есть дата или строка. Вот (сжатый) вывод dput (): структура (c (1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 1L, 9L, 9L), .Label = c (, 2012/10/04 00:00:00, 2012/10/09 00:00:00, 2012 / 10/15 00:00:00, 2012/11/02 00:00:00, 2012/11/12 00:00:00, 2012/11/15 00:00:00, 2012/11/16 00: 00:00, 2012/11/19 00:00:00, 2012/11/30 00:00:00), класс = коэффициент)   -  person Tyler Durden    schedule 29.11.2012
comment
см. комментарий под моим ответом о факторах ...   -  person Ben Bolker    schedule 29.11.2012


Ответы (2)


Если это строки, делает что-нибудь простое, например

mystr <- c("2012/11/16 00:00:00","   ","")
mystr[grepl("^ *$",mystr)] <- NA
as.Date(mystr)

Работа? (Регулярное выражение "^ *$" ищет строки, состоящие из начала строки (^), нуля или более пробелов (*), за которыми следует конец строки ($). В целом, я думаю, вы могли бы использовать "^[[:space:]]*$" для захвата других типов пробелов (табуляции и т. д.)

person Ben Bolker    schedule 29.11.2012
comment
будьте осторожны с факторами, возможно, вы захотите сначала as.character() их - grepl может работать с факторами странным образом. - person Ben Bolker; 29.11.2012
comment
Странно, правда? Как R по умолчанию устанавливает все факторы, когда вы используете read.csv () для чтения данных. Похоже, что grep сработал. Я просто просматриваю полученные результаты, чтобы убедиться, что все работает нормально. - person Tyler Durden; 29.11.2012
comment
Хорошо, спасибо, ребята. Кажется, что метод GREPL действительно хорошо себя зарекомендовал. - person Tyler Durden; 29.11.2012
comment
вас могут заинтересовать stringsAsFactors=FALSE (см. ?options и ?read.csv) - person Ben Bolker; 29.11.2012

Еще лучше, правильно вставьте NA при чтении CSV:

read.csv(..., na.strings='')

или указать вектор всех значений, который следует читать как NA ...

read.csv(..., na.strings=c('','  ','   '))
person smci    schedule 13.11.2016