2016-05-06 6 views
0

У меня есть одна колонка в кадре данных, которая состоит из кодов кода, таких как AAPL (для Apple), TWTR (для Twitter) и многих других. Я хочу создать новые столбцы на основе количества кодов кода из фрейма данных и заполнить эти столбцы ценой закрытия акций, которая будет извлекаться из API. Результат должен выглядеть так: Click here for the expected outputAPI-вызов на столбец в R

Однако, когда я запускаю приведенный ниже код, он показывает предупреждение и ошибку, так как количество строк между столбцами различно. У кого-нибудь есть решение?

library(Quandl) 

portfolio <- data.frame(Code=c("AAPL", "TWTR", "MSFT"), 
        stringsAsFactors=FALSE) 


analytic <- function(pf, startDate) { 
    z <- do.call(cbind.data.frame, lapply(seq(1:nrow(pf)), function(x) { 
    API <- Quandl(paste0("WIKI/", pf$Code[x]), 
       type = "raw", 
       start_date = startDate, 
       end_date=Sys.Date()) 
    ValuebyDate <- API[,c("Date", "Close")] 
    return(ValuebyDate) 
})) 
return(z) 
} 

analytic(portfolio, "2016-01-01") 

ответ

0

Вот еще один способ решения вашей проблемы с использованием другого подхода.

rm(list=ls()) 
library(tseries) 
portfolio <- data.frame(Code=c("AAPL", "TWTR", "MSFT"), 
       stringsAsFactors=FALSE) 
startDate = "2016-01-04" 

getHistData <- function(x){ 

    ts <- get.hist.quote(instrument = portfolio$Code[x], start = startDate, end = Sys.Date(), 
             quote = "Close", provider = "yahoo", retclass = "zoo") 
    names(ts) <- portfolio$Code[x] 
    head(ts) 
    return(ts) 
} 

ts1 = getHistData(1) 
head(ts1) 
ts2 = getHistData(2) 
head(ts2) 
ts3 = getHistData(3) 
head(ts3) 

cbind(ts1,ts2,ts3) 

Обновлено: это позволит вам построить таблицу без ручного запуска TS1, TS2, TS3

library(zoo) 
stockPrice <- zoo() 

for (i in 1: length(portfolio$Code)) { 
    ts <- getHistData(i) 
    stockPrice <- zoo(merge(ts, stockPrice, all=TRUE)) 
} 

head(stockPrice)