Получение ошибочного количества заменяемых элементов не кратно длине замены.

Я пытаюсь преобразовать запись в формат даты и времени с помощью функции strptime. Однако я не уверен, почему я получаю сообщение об ошибке:

количество заменяемых элементов не кратно длине замены.

Я попытался проверить длину записи с помощью функции length, но обе имеют одинаковую длину.

data <- DT
head(data[6])
#                column
# 1 2014-12-22 23:53:48
# 2 2014-12-22 23:20:34
# 3 2014-12-22 23:20:30
# 4 2014-12-22 23:20:16
# 5 2014-12-22 23:20:07
# 6 2014-12-22 23:05:49

data[,6] <- as.character(data[,6])

temp_file <- matrix(0,nrow=nrow(data))

temp_file[1] <- strptime(data[1, 6],"%F %T")
# Warning message:
# In temp_file[1] <- strptime(data[1, 6], "%F %T") :
#   number of items to replace is not a multiple of replacement length

length(temp_file[1])
# [1] 1

length(data[1,6])
# [1] 1

length(strptime(data[1, 6], "%F %T") )
# [1] 1

Любая помощь приветствуется.

Спасибо!


person dixi    schedule 07.01.2015    source источник
comment
На самом деле это хороший вопрос. Это не ошибка, а предупреждение, но полученный результат неверен, поэтому вы можете рассматривать его как ошибку. Причина, по которой это происходит, заключается в определении matrix в R, которое может получать только атомарные векторы. Когда вы пытаетесь передать strptime в матрицу, это класс "POSIXlt" "POSIXt", поэтому он отменяет его и, таким образом, возвращает список своих атрибутов (длина которых больше 1), то есть unclass(strptime(data[1,1],"%F %T")). Первое значение - 48 секунд. Это именно то, что у вас есть в temp_file[1] сейчас.   -  person David Arenburg    schedule 07.01.2015
comment
Таким образом, либо используйте data.frame вместо matrix, либо попробуйте преобразовать свой вектор в атомарный, например: temp_file[1] <- as.character(strptime(data[1,1],"%F %T"))   -  person David Arenburg    schedule 07.01.2015


Ответы (1)


Вы можете преобразовать вектор символов в формат даты и времени с помощью функции ymd_hms пакета lubridate:

library(lubridate)

# data frame simulation
structure(list(X1 = c(1, 1, 1, 1, 1, 1), X1.1 = c(1, 1, 1, 1, 1, 1), 
    X1.2 = c(1, 1, 1, 1, 1, 1), X1.3 = c(1, 1, 1, 1, 1, 1), 
    X1.4 = c(1, 1, 1, 1, 1, 1), date_time_char = c("2014-12-22 23:53:48", 
    "2014-12-22 23:20:34", "2014-12-22 23:20:30", "2014-12-22 23:20:16", 
    "2014-12-22 23:20:07", "2014-12-22 23:05:49")), class = "data.frame", row.names = c(NA, -6L))

# transform from character to datetime
data$date_time <- ymd_hms(data[, 6])
data[, 7]

Выход:

[1] "2014-12-22 23:53:48 UTC" "2014-12-22 23:20:34 UTC" "2014-12-22 23:20:30 UTC" "2014-12-22 23:20:16 UTC"
[5] "2014-12-22 23:20:07 UTC" "2014-12-22 23:05:49 UTC"

N.B. Действительно хороший комментарий Дэвида Аренбурга:

На самом деле это хороший вопрос. Это не ошибка, а предупреждение, но полученный результат неверен, поэтому вы можете рассматривать его как ошибку. Причина, по которой это происходит, заключается в определении матрицы в R, которая может получать только атомарные векторы. Когда вы пытаетесь передать strptime в матрицу, это класс "POSIXlt" "POSIXt", поэтому он отменяет его класс и, таким образом, возвращает список его атрибутов (длина которых больше 1), то есть unclass (strptime (data [1,1], «% F% T»)). Первое значение - 48 секунд. Это именно то, что сейчас есть в temp_file [1].

person Artem    schedule 22.09.2018