Преобразование списка фреймов данных в список объектов xts превращает данные в символы - невозможно получить доступ [в R] - PullRequest
0 голосов
/ 16 сентября 2018

Учитывая вектор имен трекеров, например: datanames = c("A", "B", "C", "D", "E")

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

for (stocks in datanames) 
{
  stockdfs[[stocks]] = mycsv[mycsv$tracker == stocks,]
}

Это прекрасно работает.

Я сейчас пытаюсь преобразовать этот список в список, содержащий объекты xts, чтобы я мог провести некоторый анализ временных рядов.Поэтому я добавляю:

      row.names(stockdfs[[stocks]]) = stockdfs[[stocks]]$Date #xts requirement
##BELOW IS WHERE THE PROBLEM LIES##
      stockxts[[stocks]] = as.xts(stockdfs[[stocks]])
      stockinsampxts[[stocks]] = as.xts(stockdfs[[stocks]][0:2000,])
      stockoutsampxts[[stocks]] = as.xts(stockdfs[[stocks]][2000:nrow(stockdfs[[stocks]]),])
      print(stocks)

Проблема в том, что когда я пытаюсь просмотреть объект xts внутри списка, я получаю:

Error in names[[i]] : subscript out of bounds

Странная вещь, я все еще могу получить доступданные из консоли, такие как print (stockxts [["A"]]).

Помощь очень ценится, я новичок в R!Спасибо!

1 Ответ

0 голосов
/ 16 сентября 2018

Существует 2 способа создания объекта xts, один из которых создается с помощью row.names, а второй - с помощью параметра order.by в функции as.xts.

Но вы должны понимать, что вы не удаляете столбец даты из ваших данных. Данные xts представляют собой матрицу, и, если указана дата, все в матрице является символом.

После вашего заявления об именах строк вы можете сделать следующее, чтобы удалить даты:

 stockdfs[[stocks]]$Date <- NULL

, а затем stockxts[[stocks]] = as.xts(stockdfs[[stocks]]) будет иметь данные xts в числовой форме (если в других столбцах нет других символьных значений).

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

A <- data.frame(Date = seq(as.Date("2018-02-01"), as.Date("2018-02-05"), by = "day"),
                val1 = seq(1:5))

# everything a character
as.xts(A, order.by = A$Date)
           Date         val1
2018-02-01 "2018-02-01" "1" 
2018-02-02 "2018-02-02" "2" 
2018-02-03 "2018-02-03" "3" 
2018-02-04 "2018-02-04" "4" 
2018-02-05 "2018-02-05" "5" 

# Everything numeric
as.xts(A[, -which(names(A) == "Date")], order.by = A$Date)
           [,1]
2018-02-01    1
2018-02-02    2
2018-02-03    3
2018-02-04    4
2018-02-05    5
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...