R — преобразование фрейма данных в xts добавляет цитаты (в xts)

#r #xts

#r #xts

Вопрос:

Я использую фрейм данных для создания xts. Создается xts, но все значения (кроме индекса в xts) находятся в кавычках. Это приводит к тому, что я не могу использовать данные, поскольку многие функции, такие как sum, не работают.

Есть идеи, как я могу получить xts, созданный без цитат?

Вот мой код [обновлен из-за комментария о несоответствии имен фреймов данных / xts]:

 # creates a dataframe with dates and currency
mydf3 <- data.frame(date = c("2013-12-10", "2015-04-01", 
"2016-01-03"), plus = c(4, 3, 2), minus = c(-1, -2, -4))
# transforms the column date to date-format
mydf3 = transform(mydf3,date=as.Date(as.character(date),format='%Y-%m-%d'))
# creates the xts, based on the dataframe mydf3
myxts3 <- xts(mydf3, order.by = mydf3$date)
# removes the column date, since date is now stored as index in the xts
myxts3$date <- NULL
  

Комментарии:

1. Это вам помогает? t = transform(mydf3,date2=as.Date(mydf3$date,format='%Y-%m-%d')); myxts3 <- xts(t, order.by = t$date2)

2. Вы несовместимы с именами ваших переменных. Попробуйте myxts3<-xts(t[,-1],order.by = t$date)

Ответ №1:

Вы должны понимать, что базовая структура данных, которая хранит ваши данные в объекте xts, является объектом матрицы R, который может иметь только один тип R (например, все числовые или все символьные). Временные метки хранятся в виде отдельного вектора (в данном случае вашего столбца даты), который используется для индексации / подстановки данных по времени.

Причина вашей проблемы в том, что ваш date столбец заставляет матрицу данных преобразовываться в матрицу символьного типа (в объекте xts) вместо числового. Кажется, что date класс преобразуется в символ, когда он включен в матрицу:

 > as.matrix(mydf3)
     date         plus minus
[1,] "2013-12-10" "4"  "-1" 
[2,] "2015-04-01" "3"  "-2" 
[3,] "2016-01-03" "2"  "-4" 
  

Каждый раз, когда у вас есть нечисловые данные в ваших данных, которые вы конвертируете в xts (в x аргументе xts ), вы столкнетесь с такой проблемой.

Ваша проблема может быть решена следующим образом (что wici показал в комментариях)

 myxts3 <- xts(x= mydf3[, c("plus", "minus")], order.by = mydf3[, "date"])

> coredata(myxts3)
plus minus
[1,]    4    -1
[2,]    3    -2
[3,]    2    -4
> class(coredata(myxts3))
[1] "matrix"
  

Комментарии:

1. Спасибо, теперь это работает. Я использовал фрейм данных в качестве начальной точки, и, похоже, мне следовало использовать matrix в качестве начальной точки, чтобы не смешивать цифры и символы. Теперь, когда это работает, я провел несколько дополнительных тестов с zoo, поскольку в некоторых случаях мне понадобятся данные как с символами, так и с цифрами (и есть возможность использовать некоторые функции, такие как ‘last’, чтобы использовать, что на самом деле дата индексируется).

Ответ №2:

Часть даты должна быть в индексе, а не в части данных. read.zoo сделает это для вас, создавая объект зоопарка. Затем вы можете преобразовать это в xts, если вам это нужно в такой форме.

 library(xts)
as.xts(read.zoo(mydf3))
##            plus minus
## 2013-12-10    4    -1
## 2015-04-01    3    -2
## 2016-01-03    2    -4