2014-01-29 3 views
1

Я пытаюсь добиться следующегоИспользуя переменную, чтобы добавить столбец кадра данных в R

stocks <- c('AXP', 'VZ', 'V') 
library('quantmod') 
getSymbols(stocks) 

Над командой создает 3 переменных данных с именем AXP, VZ и V

prices <- data.frame(stringAsFactors=FALSE) 

Здесь я Я пытаюсь создать столбец с именем в качестве билета (например, AXP) с данными в . Следующее должно добавить 3 кадра в кадр, имена AXP, VZ и V с данными в AXP $ AXP.Adjusted, VZ $ VZ.Adjusted , V $ V.Adjusted

for (ticker in stocks) 
{ 
    prices$ticker <- ticker$ticker.Adjusted 
} 

Как это достичь? R дает такую ​​ошибку, когда я пытаюсь это сделать

Error in ticker$ticker.Adjusted : 
    $ operator is invalid for atomic vectors 

Любые идеи?

Заранее спасибо

ответ

1

Вот простой способ сделать это

do.call('cbind', lapply(mget(stocks), function(d) d[,6])) 

Объяснения:

  1. mget(stocks) получает три фрейма данных в виде списка
  2. lapply извлекает 6-й столбец, который содержит переменный интерес ,
  3. do.call передает список из (2) в cbind, который связывает их вместе в виде столбцов.

ПРИМЕЧАНИЕ. Это решение не заботится о разном количестве столбцов в кадрах данных.

+0

Работает красиво. благодаря – bhamu

0

я не понял ваш вопрос, то теперь я думаю, я понял, что вы хотите:

То, что вы написали, не работает, потому что объект ticker является строка символов. Если вы хотите получить объект с именем после этой строки, вы должны оценить проанализированный текст.

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

for (ticker in stocks){ 
     prices <- cbind(prices, eval(parse(text=ticker))[,paste0(ticker, ".", "Adjusted")]) 

} 

Это даст вам:

An ‘xts’ object on 2007-01-03/2014-01-28 containing: 
    Data: num [1:1780, 1:4] 53.4 53 52.3 52.8 52.5 ... 
- attr(*, "dimnames")=List of 2 
    ..$ : NULL 
    ..$ : chr [1:4] "AXP.Adjusted" "AXP.Adjusted.1" "VZ.Adjusted" "V.Adjusted" 
    Indexed by objects of class: [Date] TZ: UTC 
    xts Attributes: 
List of 2 
$ src : chr "yahoo" 
$ updated: POSIXct[1:1], format: "2014-01-29 01:06:51" 
+0

Работает также, как и более простая версия с mget, но теперь я получаю эту идею. Благодарю. – bhamu

0

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

Код ниже использует последние 1000 строк каждого файла (самое последнее) и не использует циклы.

stocks <- c('AXP', 'VZ', 'V') 
library('quantmod') 
getSymbols(stocks) 

prices=do.call(data.frame, 
       lapply(stocks, 
         function(s)tail(get(s)[,paste0(s,".Adjusted")],1000))) 
colnames(prices)=stocks 
head(prices) 
#    AXP VZ  V 
# 2010-02-08 34.70 21.72 80.58 
# 2010-02-09 35.40 22.01 80.79 
# 2010-02-10 35.60 22.10 81.27 
# 2010-02-11 36.11 22.23 82.73 
# 2010-02-12 36.23 22.15 82.38 
# 2010-02-16 37.37 22.34 83.45 

Работая изнутри, s является тикер (так, например, "AXP"); get(s) возвращает объект с этим именем, поэтому AXP; get(s)[,paste0(s,".Adjusted")] эквивалентно AXP[,"AXP.Adjusted"]; tail(...,1000) возвращает последние 1000 строк .... Поэтому, когда s = «AXP», функция возвращает последние 1000 строк AXP$AXP.Adjusted.

lapply(...) применяет эту функцию к каждому элементу в запасах.

do.call(data.frame,...) вызывает функцию data.frame со списком столбцов, возвращаемых lapply(...).

Смежные вопросы