2017-02-05 8 views
0

私は、Rとforループとのやりとりについてquantmodパッケージについて助けが必要です。 私はベクトルyear持っている:quantumodから財務情報をループ

library(quantmod) 
getFinancials("GE") 
year <- colnames(viewFin(GE.f, "IS", "A")) 
year 
# [1] "2015-12-31" "2014-12-31" "2013-12-31" "2012-12-31" 

viewFin機能は私にこの出力を与える:

viewFin(GE.f, type="IS", period="A")["Net Income", year[1]] 
# Annual Income Statement for GE 
# [1] -6126 

をしかし、私は年にインデックスを付けることにより、ループにしようとした場合、私はこのエラーを取得する:

> for(x in 1:4){ 
+ (viewFin(GE.f, type="IS", period="A")["Net Income", year[x]]) 
+ x=x+1 
+ } 

Annual Income Statement for GE 
Annual Income Statement for GE 
Annual Income Statement for GE 
Annual Income Statement for GE 
Error in viewFin(GE.f, type = "IS", period = "A")["Net Income", year[x]] : 
    subscript out of bounds 

私の考えは、企業のデータフレームを作成するために、日付、財務名称(純利益、株式など)、シンボルを作成することです流行と年&金融列として。

viewFin機能がエントリをブロックする値はxですか?

答えて

1

Rのforループ内のイテレータを変更することはできません。したがって、forループの最後のx = x + 1は不要で無視されます。また、forループで自動印刷が無効になっているので、明示的にprintを呼び出す必要があります。あなたができるもう一つのことは、ベクトルを直接反復することです(サブセットする必要はありません)。したがって、forループは次のようになります。

for(y in year) { 
    print(viewFin(GE.f, type="IS", period="A")["Net Income", y]) 
} 

つまり、forループは不要です。サブセットを直接使用して同じ結果を得ることができます。

netIncome <- viewFin(GE.f, type="IS", period="A")["Net Income",] 

列と行などの記号とdata.frame、およびラインアイテムと日付をすることが問題となり得る理由はありませんので、各シンボルはデータの年の同じ数、またはまったく同じを持っている必要があります広告申込情報あなたが作業しているものが分かるまで、すべてのデータを最初に長い形式にする方がいいでしょう。ここでは、複数のシンボルに対してこれを行う関数があります。

stackFinancials <- 
function(symbols, type = c("BS", "IS", "CF"), period = c("A", "Q")) { 
    type <- match.arg(toupper(type[1]), c("BS", "IS", "CF")) 
    period <- match.arg(toupper(period[1]), c("A", "Q")) 

    getOne <- function(symbol, type, period) { 
    gf <- getFinancials(symbol, auto.assign = FALSE) 
    vf <- viewFinancials(gf, type = type, period = period) 
    df <- data.frame(vf, line.item = rownames(vf), type = type, period = period, 
        symbol = symbol, stringsAsFactors = FALSE, check.names = FALSE) 
    long <- reshape(df, direction="long", varying=seq(ncol(vf)), v.names="value", 
        idvar="line.item", times=colnames(vf)) 
    rownames(long) <- NULL 
    long 
    } 
    # combine all into one data.frame 
    do.call(rbind, lapply(symbols, getOne, type = type, period = period)) 
} 

そして、ここでそれを使用しての例です:

R> Data <- stackFinancials(c("GE", "AAPL"), type = "IS", period = "A") 
Annual Income Statement for GE 
Annual Income Statement for AAPL 
R> head(Data) 
           line.item type period symbol  time value 
1        Revenue IS  A  GE 2016-12-31 123693 
2     Other Revenue, Total IS  A  GE 2016-12-31  NA 
3       Total Revenue IS  A  GE 2016-12-31 123693 
4     Cost of Revenue, Total IS  A  GE 2016-12-31 92508 
5       Gross Profit IS  A  GE 2016-12-31 31185 
6 Selling/General/Admin. Expenses, Total IS  A  GE 2016-12-31 18377 
R> tail(Data) 
            line.item type period symbol  time value 
387 Effect of Special Items on Income Taxes IS  A AAPL 2013-09-28 NA 
388 Income Taxes Ex. Impact of Special Items IS  A AAPL 2013-09-28 NA 
389   Normalized Income After Taxes IS  A AAPL 2013-09-28 NA 
390  Normalized Income Avail to Common IS  A AAPL 2013-09-28 NA 
391      Basic Normalized EPS IS  A AAPL 2013-09-28 NA 
392     Diluted Normalized EPS IS  A AAPL 2013-09-28 5.68 
+0

ありがとうございました!素晴らしいコード! – Cads

関連する問題