преобразовать указатель дат в фрейм данных дат

Я делаю некоторые манипуляции с временными рядами, в результате чего преобразовываю некоторые векторы даты в матричные элементы для дальнейшей обработки. Но по какой-то причине я не могу повторно применить класс даты обратно внутри матрицы или формы фрейма данных.

позволять

idx <- as.Date(seq(20),format="%Y-%m-%d",origin="1970-01-01")
idx.m <- matrix(idx,nrow=5,ncol=4)

дает

  > idx.m
     [,1] [,2] [,3] [,4]
[1,]    1    6   11   16
[2,]    2    7   12   17
[3,]    3    8   13   18
[4,]    4    9   14   19
[5,]    5   10   15   20

Я конвертирую в фрейм данных для хранения объектов даты.

idx.df <- data.frame(idx.m)

Если я попробую применить несколько типов, мне не удастся вернуть формат даты.

> apply(idx.df,1,as.Date)
   [,1] [,2] [,3] [,4] [,5]
X1    1    2    3    4    5
X2    6    7    8    9   10
X3   11   12   13   14   15
X4   16   17   18   19   20

Даже если информация была потеряна при преобразовании матрицы, я все равно смогу преобразовать ее обратно в даты.

Я пробовал несколько других способов и могу поклясться, что мог делать это в прошлом. Есть ли способ начать с индексного вектора, как указано выше, изменить его форму и получить фрейм данных (я не думаю, что матрица может содержать даты, но символы) дат, поддерживающих свойство даты?

Я мог бы вручную построить фрейм данных таким образом

> idx.a <- idx[1:10]
> idx.b <- idx[11:20]
> data.frame(idx.a,idx.b)
        idx.a      idx.b
1  1970-01-02 1970-01-12
2  1970-01-03 1970-01-13
3  1970-01-04 1970-01-14
4  1970-01-05 1970-01-15
5  1970-01-06 1970-01-16
6  1970-01-07 1970-01-17
7  1970-01-08 1970-01-18
8  1970-01-09 1970-01-19
9  1970-01-10 1970-01-20
10 1970-01-11 1970-01-21
> class(data.frame(idx.a,idx.b))
[1] "data.frame"
> sapply(data.frame(idx.a,idx.b),class)
 idx.a  idx.b 
"Date" "Date" 

Любые идеи о том, что мне не хватает?

  • Возможно, мне следует добавить, что я намерен выполнить множество манипуляций с матрицами для измененного содержимого данных, но я хочу иметь возможность извлекать соответствующие значения индекса (класса даты) по строкам и индексации столбцов позже.

person pat    schedule 11.10.2014    source источник
comment
ок, согласился. Но есть ли способ хотя бы достичь вышеупомянутого? 1) преобразовать в матрицу с числовыми элементами даты 2) выполнить все манипуляции с матрицей 3) преобразовать обратно в фрейм данных дат.   -  person pat    schedule 11.10.2014


Ответы (1)


Попробуй это:

idx <- as.Date(seq(20),format="%Y-%m-%d",origin="1970-01-01")
idx.m <- idx
dim(idx.m) <- c(5, 4)

is.matrix(idx.m)
## TRUE

Вы можете получить ячейку, например id.m[2, 3], столбец, например idx.m[, 2] и т. Д., Но не все будет работать должным образом. print(idx.m) распечатает его, как будто это вектор, даже если это матрица, а as.data.frame.matrix(idx.m) преобразует его во фрейм данных, но удалит класс "Date", оставив числа.

Если вы действительно хотите преобразовать его во фрейм данных, вам придется обойти ограничения:

DF <- as.data.frame.matrix(idx.m)
DF[] <- lapply(DF, as.Date, origin = "1970-01-01")

or

do.call(data.frame, split(idx.m, col(idx.m)))
person G. Grothendieck    schedule 11.10.2014
comment
Вау, это что-то новенькое для меня. +1 - person Rich Scriven; 11.10.2014
comment
Интересный и к тому же очень компактный +1. Часто у меня есть векторы, которые при преобразовании в наборы матриц rowXcol имеют остатки. Я не могу просто сделать что-то вроде dim (idx.m) ‹- c (5,), не зная другого значения. Я могу сделать это в форме матрицы (idx.m, ncol) и получить предупреждения (). Я должен думать об этом больше. - person pat; 11.10.2014
comment
Если дело в том, что вы просто не знаете количество столбцов, попробуйте следующее: dim(idx.m) <- c(5, length(idx.m) / 5) - person G. Grothendieck; 11.10.2014
comment
Остаток возвращает ошибку, Ошибка: ... dims [product 24] не соответствуют длине объекта По общему признанию небрежно в формате матрицы [idx.m, ncol], но я получаю только предупреждения. - person pat; 11.10.2014
comment
спасибо также за хорошие альтернативы. Мне действительно нужно поближе познакомиться с [] ‹- методом, так как он, кажется, решает многие из этих проблем. - person pat; 11.10.2014
comment
Ваш вектор должен иметь длину, делимую на 5. В противном случае он должен быть увеличен до такой длины. Предположим, у нас есть idx19 <- idx[1:19]. Затем: idx.m <- c(idx19, rep(NA, 5 * ceiling(length(idx19) / 5) - length(idx19))); dim(idx.m) <- c(5, length(idx.m) / 5); class(idx.m) <- "Date". - person G. Grothendieck; 11.10.2014