преобразование фрейма данных (факторов) в xts

Я знаю, что об этом спрашивали несколько раз, но я не мог найти правильный способ обойти мою проблему. У меня есть очень простой файл CSV, который я загружаю, и он выглядит так:

27.07.2015,100
28.07.2015,100.1504
29.07.2015,100.1957
30.07.2015,100.5044
31.07.2015,100.7661
03.08.2015,100.9308
04.08.2015,100.8114
05.08.2015,100.6927
06.08.2015,100.7501
07.08.2015,100.7194
10.08.2015,100.8197
11.08.2015,100.8133

Теперь мне нужно преобразовать мой data.frame в xts, чтобы я мог использовать пакет PerformanceAnalytics. Мой data.frame имеет структуру:

> str(mpey)
'data.frame':   243 obs. of  2 variables:
 $ V1: Factor w/ 243 levels "01.01.2016","01.02.2016",..: 210 218 228 234 241 21 30 38 45 52 ...
   - attr(*, "names")= chr  "5" "6" "7" "8" ...
 $ V2: Factor w/ 242 levels "100","100.0062",..: 1 4 5 10 16 20 17 13 15 14 ...
   - attr(*, "names")= chr  "5" "6" "7" "8" ...

Я пробовал разные вещи с функцией as.xts, но смог заставить ее работать. Не могли бы вы помочь мне преодолеть это?


person paolino    schedule 01.07.2016    source источник
comment
V1 - это фактор, может быть, изменить его на класс символов или даты? И V2 - это коэффициент, возможно, вам может понадобиться изменить его на числовой.   -  person zx8754    schedule 01.07.2016
comment
уже пробовал, но не могу. он всегда дает мне *** as.Date.factor(mpey[,1]) Ошибка в charToDate(x): строка символов не имеет стандартного однозначного формата или если я пытаюсь *** › as.Date(mpey[, 1]) Ошибка в charToDate(x): строка символов не имеет стандартного однозначного формата   -  person paolino    schedule 01.07.2016
comment
Когда я добавляю формат = %d/%m/%Y, я получаю 252 строки NA.....   -  person paolino    schedule 01.07.2016
comment
Добавление format = "%d/%m/%Y" не сработает, потому что ваши даты не похожи на "27/07/2015". Используйте format = "%d.%m.%Y". И что-то не так с вашими V2 данными, если read.table преобразует их в фактор. Вам нужно посмотреть необработанный CSV для нечислового символа в этом столбце. Вы можете начать с преобразования V2 в числовое значение в R и найти строку (строки), которые принудительно преобразуются в NA, потому что они не могут быть преобразованы в число.   -  person Joshua Ulrich    schedule 01.07.2016


Ответы (1)


Вот решение с использованием пакета tidyquant, который содержит as_xts() для приведения фреймов данных к объектам xts и as_tibble() для приведения объектов временных рядов, таких как xts, к tibbles («аккуратные» фреймы данных).

Воссоздайте свои данные

> data_df
# A tibble: 12 × 2
         date    value
       <fctr>   <fctr>
1  27.07.2015      100
2  28.07.2015 100.1504
3  29.07.2015 100.1957
4  30.07.2015 100.5044
5  31.07.2015 100.7661
6  03.08.2015 100.9308
7  04.08.2015 100.8114
8  05.08.2015 100.6927
9  06.08.2015 100.7501
10 07.08.2015 100.7194
11 10.08.2015 100.8197
12 11.08.2015 100.8133

Во-первых, нам нужно переформатировать ваш фрейм данных. Даты и значения хранятся как факторы, и они должны быть в классе даты и двойного числа соответственно. Мы загрузим tidyquant и переформатируем фрейм данных. Обратите внимание, что tidyquant загружает tidyverse и финансовые пакеты, поэтому вам не нужно загружать что-либо еще. Дату можно преобразовать с помощью lubridate::dmy, которая преобразует символы в формате день-месяц-год в дату. Значение должно переходить от фактора к символу, а затем от символа к двойному, и это делается путем вложения as.numeric и as.character.

> library(tidyquant)
> data_tib <- data_df %>%
     mutate(date = dmy(date),
            value = as.numeric(as.character(value)))
> data_tib
# A tibble: 12 × 2
         date    value
       <date>    <dbl>
1  2015-07-27 100.0000
2  2015-07-28 100.1504
3  2015-07-29 100.1957
4  2015-07-30 100.5044
5  2015-07-31 100.7661
6  2015-08-03 100.9308
7  2015-08-04 100.8114
8  2015-08-05 100.6927
9  2015-08-06 100.7501
10 2015-08-07 100.7194
11 2015-08-10 100.8197
12 2015-08-11 100.8133

Теперь мы можем принудить к xts, используя функцию tidyquant::as_xts(). Просто укажите date_col = date.

> data_xts <- data_tib %>%
     as_xts(date_col = date)
> data_xts
              value
2015-07-27 100.0000
2015-07-28 100.1504
2015-07-29 100.1957
2015-07-30 100.5044
2015-07-31 100.7661
2015-08-03 100.9308
2015-08-04 100.8114
2015-08-05 100.6927
2015-08-06 100.7501
2015-08-07 100.7194
2015-08-10 100.8197
2015-08-11 100.8133
person Matt Dancho    schedule 02.03.2017