2017-04-26 5 views
0

R-初心者です。データフレームにアクセスするために文字列を名前に変更します。

私は次のような問題を持っている:私はquantmodのGetSymbols()を通じて、いくつかのデータフレームを取得するために使用される文字列を含むベクトルを持っている:

library(quantmod) 
tickers = c("GOOG", "XOM", "GE", "KO", "F", "GS", "AIG", "HPQ", "WMT", "MSI") 
n = length(tickers) 



for (i in 1:n){ 
    getSymbols(Symbols = tickers[i], from=start, to=end, src="yahoo") 

今私の問題は次のとおりです:私はこの内の特定のデータフレームにアクセスしたいですループを作成し、それ自身のベクトルで ".Close"カラムを抽出することもできます。 は、私は次のことを試してみました(および他のいくつかの試行):

adress = tickers[i] 
    price.[i] = cbind(adress[,4]) 


} 

しかし、アドレスは単なる文字列であるので、明らかにそれは動作しません。 私の質問は、どのように私はこの "関数"は、ループがまだ動作するようにGetSymbolsによって以前に作成されたデータフレームをadresses別のデータ型に文字列を変換することができます。私の次の質問は、price.[i]の反復がうまく動作するようになっていて、それぞれ異なる名前のn個のベクトルがある場合です。

私がこれまでに作成したスクリプトを抽象化するのは、私が持っているシンボルの数に関係なく、私は、例えばダイアグラフを使用するときに、それぞれのシンボルを処理する必要はありません。 rChartsか何か、それからスクリプトの終わりにティッカーの終値のすべてのチャートを与えるでしょう。

私の言葉は分かりやすいと思います。私はまだ私の新しい仕事のためにこれに取り掛かることを試みているR-初心者であるので、これは愚かな疑問であるかもしれないと自分自身を言います。

読んでいただきありがとうございました。良い一日を。

答えて

0

私はリストが行く方法であることに同意します。しかし、私はループを使用しないでください。代わりにこれを試してみてください:

tickers = c("GOOG", "XOM", "GE", "KO", "F", "GS", "AIG", "HPQ", "WMT", "MSI") 
getSymbols(tickers, from = start, end = end) 

あなたは、マトリクス状に価格をしたい場合:

prices = do.call(merge, lapply(tickers, function(x) Cl(get(x))) 
names(prices) = tickers 

それとも、ベクトルとしての価格をしたい場合:

まず
prices = lapply(tickers, function(x) get(x)) 
names(prices) = tickers 
+0

私はあなたの答えのすべてを感謝し、非常に感謝しています!この1つは、私は、ダイアグラフのために私の結果を使用するのに最適でした。みんなありがとう! –

0

getSymbolsが戻らないことに注意してくださいデフォルトではdata.frameです。これは、時間ベースのインデックスを持つ行列であるxtsオブジェクトを返します。

あなたの問題を解決するための推奨方法は、リストを作成するティッカー上lapplyを使用することです。次に、名前付きリストを作成する例を示します。 auto.assign = FALSEを設定して、getSymbolsがデータをロードするのではなく返すようにする必要があることに注意してください。

library(quantmod) 
tickers <- c("GOOG", "XOM", "GE", "KO", "F", "GS", "AIG", "HPQ", "WMT", "MSI") 

# A named list 
Data <- setNames(lapply(tickers, getSymbols, src = "yahoo", auto.assign = FALSE), tickers) 
# Use lapply again to extract the close for each symbol 
Close <- lapply(Data, Cl) 
# Accessing a specific ticker's data 
head(Close[[tickers[1]]]) 
0

ここではtidyquantパッケージを使用しています。私は、これはあなたが必要なものを正確に行い信じる:tq_get()に1つの簡潔呼び出しを使用して、(きちんとデータフレームまたは「tibble」)データフレームに株式のそれぞれの価格を取得し、その後、withingグループの分析を実行するためにあなたを設定しますデータフレームは、group_by()機能を使用します。


library(tidyquant) 

tickers <- c("GOOG", "XOM", "GE", "KO", "F", "GS", "AIG", "HPQ", "WMT", "MSI") 
stock_prices <- tq_get(tickers, 
         get = "stock.prices", 
         from = "2016-01-01", 
         to = "2016-12-31") 
stock_prices %>% 
    group_by(symbol) 
#> Source: local data frame [2,520 x 8] 
#> Groups: symbol [10] 
#> 
#> symbol  date open high  low close volume adjusted 
#>  <chr>  <date> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> 
#> 1 GOOG 2016-01-04 743.00 744.060 731.258 741.84 3272800 741.84 
#> 2 GOOG 2016-01-05 746.45 752.000 738.640 742.58 1950700 742.58 
#> 3 GOOG 2016-01-06 730.00 747.180 728.920 743.62 1947000 743.62 
#> 4 GOOG 2016-01-07 730.31 738.500 719.060 726.39 2963700 726.39 
#> 5 GOOG 2016-01-08 731.45 733.230 713.000 714.47 2450900 714.47 
#> 6 GOOG 2016-01-11 716.61 718.855 703.540 716.03 2090600 716.03 
#> 7 GOOG 2016-01-12 721.68 728.750 717.317 726.07 2024500 726.07 
#> 8 GOOG 2016-01-13 730.85 734.740 698.610 700.56 2501700 700.56 
#> 9 GOOG 2016-01-14 705.38 721.925 689.100 714.72 2225800 714.72 
#> 10 GOOG 2016-01-15 692.29 706.740 685.370 694.45 3592400 694.45 
#> # ... with 2,510 more rows 
0

を出発し、私は、オブジェクトを操作する方法について混乱していた(例えば、、オブジェクトを表す文字列( "SPY")の代わりにSPYのようなxtsオブジェクト)を返します。

Str2Obj <- function(aString) {eval(parse(text=aString))} 

Obj2Str <- function(anObjName) {deparse(substitute(anObjName))} 

例えば、GetSymbolsでダウンロードした資産からデータを抽出し、XTSオブジェクトを返すために:

は、ここでは、この問題に対処する2つの機能です

getAssetPrices <- function(assetNames, 
        select = c("Ad","Cl","Op","Hi","Lo","Vo")) { #1 
worker <- function(assetName, select) { #2 
     asset <- Str2Obj(assetName) 
     switch(select, 
       "Ad" = Ad(asset),"Cl" = Cl(asset), 
       "Op" = Op(asset),"Hi" = Hi(asset), 
       "Lo" = Lo(asset),"Vo" = Vo(asset) 
      ) 
     } #2 
lapply(assetNames, worker, select[1]) %>% do.call(merge.xts, .) 
} #1 

prices <- getAssetPrices(c("AAPL","ADBE","ADSK"), select = "Ad") 

head(prices,3) 

#    AAPL.Adjusted ADBE.Adjusted ADSK.Adjusted 
# 1995-01-03  1.2239  3.5876  8.7046 
# 1995-01-04  1.2558  3.4890  8.9666 
# 1995-01-05  1.2398  3.6255  8.9666 
任意のための

Str2ObjとObj2Str仕事名前< =>オブジェクトのコンバージョン

関連する問題