2016-09-13 2 views
0

Следующая не работает:ошибка с классом (charactervector) <- "Дата"

today <- as.character("2016-09-13") 
class(today) <- 'Date' 

today 
## [1] NA 
Warning messages: 

1: In as.POSIXlt.Date(x) : NAs introduced by coercion 

2: In as.POSIXlt.Date(x) : NAs introduced by coercion 

3: In as.POSIXlt.Date(x) : NAs introduced by coercion 
    as.numeric(a) 

В то время как это делает работу:

today <- as.character("2016-09-13") 
a <- as.Date(today) 

a 
## [1] "2016-09-13" 

as.numeric(a) 
## [1] 17057 

Я хотел бы чтобы иметь решение сделать работу class(today) <- 'Date' и понять, почему она не работает.

+2

Даты хранятся как число, а не символ, поэтому R не может отображать вектор символов с классом Date. Помимо принуждения к классу Date, 'as.Date' анализирует вектор символа на соответствующий номер. – alistaire

ответ

3

Функция class<- не вызывает никакого преобразования/принуждения. Функция class<- отображает функцию R_do_set_class в коде C. И в конечном итоге вы завершаетесь в ветке кода, где they explicitly don't do the coercion.

Посмотрите на этих двух примерах

today <- as.character("2016-09-13") 
class(today) <- 'Date' 
dput(today) 
# structure("2016-09-13", class = "Date") 

today<-as.Date("2016-09-13") 
dput(today) 
# structure(17057, class = "Date") 

Уведомление, каким образом «класс» S3 просто именованный атрибут структуры в R. Это говорит R, как интерпретировать значение в этой структуре. Если вы вручную установите класс в нечто несовместимое со значением (как вы могли бы сделать с class<-), вы рискуете сломать вещи.

Также обратите внимание, что вы не получите ошибку, если не попытаетесь напечатать значение today. Это связано с тем, что повторное присвоение «работает», но когда R использует значение (как при печати), все становится беспорядочным, потому что оно не сохраняется в способе R ожидаемого.,

Урок в том, что class<- не должен для преобразования между различными классами. Он используется только для скрипта с атрибутом класса объекта.

4

Если посмотреть на

today <- as.Date("2016-09-13") 
unclass(today) 
# [1] 17057 
typeof(today) 
# [1] "double" 

Это "double" (числовой), а не строка. Правильный способ дать класс, это с помощью:

a <- structure(17057, class = "Date") 
# [1] "2016-09-13" 

или

a <- 17057 
class(a) <- "Date" 
a 
# [1] "2016-09-13" 

Если исходить из строки символов, используйте as.Date.

+0

Я не понимаю. Если вы делаете 'today <- as.Date (« 2016-09-13 »); class (today) ', тогда вы также получите' 'Date" ' – user1134616

+0

Что касается вашего редактирования. Я начинаю с символьной строки, и я хочу изменить ее на Date, используя 'class (characterstring) <-" Date "' – user1134616

+0

Zheyuan Li почему? Где вы это читаете? – user1134616

Смежные вопросы