2017-06-20 66 views
0

我很難對JSON數據進行子集化。我對R非常瞭解子集的基礎知識。JSON子集R中的唯一日期

library(jsonlite) 
    library(curl) 

    url1="https://www.alphavantage.co/query?function=TIME_SERIES_DAILY_ADJUSTED&symbol=RCS&outputsize=full&apikey=DEMO" 

    StockData2<- fromJSON(url1,flatten = TRUE) 

數據看起來像這樣(4394天中的2天)。我遇到的麻煩是每個日期都是獨一無二的,我無法弄清楚如何將日期和其中一個子集的價格拉出來。

> str(StockData) 
List of 2 
$ Meta Data   :List of 5 
    ..$ 1. Information : chr "Daily Time Series with Splits and Dividend Events" 
    ..$ 2. Symbol  : chr "RCS" 
    ..$ 3. Last Refreshed: chr "2017-06-20 10:27:00" 
    ..$ 4. Output Size : chr "Full size" 
    ..$ 5. Time Zone  : chr "US/Eastern" 
$ Time Series (Daily):List of 4394 
    ..$ 2017-06-20 10:27:00:List of 8 
    .. ..$ 1. open    : chr "10.1100" 
    .. ..$ 2. high    : chr "10.1600" 
    .. ..$ 3. low    : chr "10.0400" 
    .. ..$ 4. close   : chr "10.1100" 
    .. ..$ 5. adjusted close : chr "10.1100" 
    .. ..$ 6. volume   : chr "17776" 
    .. ..$ 7. dividend amount : chr "0.00" 
    .. ..$ 8. split coefficient: chr "1.0000" 
    ..$ 2017-06-19   :List of 8 
    .. ..$ 1. open    : chr "9.9200" 
    .. ..$ 2. high    : chr "10.1200" 
    .. ..$ 3. low    : chr "9.9200" 
    .. ..$ 4. close   : chr "10.0800" 
    .. ..$ 5. adjusted close : chr "10.0800" 
    .. ..$ 6. volume   : chr "160599" 
    .. ..$ 7. dividend amount : chr "0.00" 
    .. ..$ 8. split coefficient: chr "1.0000" 

Daily<-StockData$`Time Series (Daily)` 

將產生4394個元素的大列表。 如何從列表中獲取「日期」和「調整關閉」?

+0

注意:您似乎需要一個有效的API密鑰才能以發佈的方式工作/ – Spacedman

+0

對不起。這將工作。 line.library(jsonlite) 庫(捲曲) 爲url1 = 「https://www.alphavantage.co/query?function=TIME_SERIES_DAILY_ADJUSTED&symbol=MSFT&apikey=demo」 StockData2 < - fromJSON(URL1,壓平= TRUE) – DC55

回答

1

現在我可以得到我有一個完整的解決方案的數據。我之前的回答使用了as.data.frame,因爲as.data.frame試圖從傳入的表達式中獲取列名,所以在真實數據上失敗(但是在我的測試中工作)。對於數據名稱和類型的一些罕見組合觸發,as.data.frame最終嘗試設置錯誤的列名稱數量。改爲使用data.frame,或者將optional=FALSE參數添加到as.data.frame修復此問題。

因此,解決辦法是:

result = setNames(
    data.frame(
    sapply(
     StockData2[["Time Series (Daily)"]], 
     function(x){ 
      x[["5. adjusted close"]] 
      })), 
    c("adjusted close")) 

,並提供:

> head(result) 
      adjusted close 
2017-06-21  70.2700 
2017-06-20  69.9100 
2017-06-19  70.8700 
2017-06-16  70.0000 
2017-06-15  69.9000 
2017-06-14  70.2700 

如果你有興趣在什麼導致了失敗,閱讀...

設置兩個非常相似的名單:

> Xnum = list(list(x=1),list(x=2)) 
> Xchar = list(list(x="1"),list(x="2")) 

x位轉換爲數據幀。對於數字,它的工作原理,但正如你看到的列名是有點長,但沒有問題:

> as.data.frame(sapply(Xnum,function(f){f$x})) 
    sapply(Xnum, function(f) {  f$x }) 
1          1 
2          2 

但對於人物之一,它在一個真正的混亂得到:

> as.data.frame(sapply(Xchar,function(f){f$x})) 
Error in as.data.frame.vector(x, ..., nm = nm) : 
    'names' attribute [3] must be the same length as the vector [1] 

因爲它最終將sapply(Xchar,function(f){f$x})表達式分解爲三部分。我不知道爲什麼數字版本不會對此產生任何影響。

+0

謝謝!我無法執行setNames line.library(jsonlite) 庫(curl) url1 =「https://www.alphavantage.co/query?function=TIME_SERIES_DAILY_ADJUSTED&symbol=MSFT&apikey=demo」 StockData2 < - fromJSON(url1, flatten = TRUE) – DC55

+0

謝謝!我無法執行setNames行。 'setNames(as.data.frame(sapply(StockData2 [[「Time Series(Daily)」]],function(x){x [[「5. close close」]])),c(「adjust close」 ))'result in ** as.data.frame.vector(x,...,nm = nm)中的錯誤: 'names'屬性[3]必須與矢量[1]的長度相同** I很抱歉...無法格式化。 – DC55

+0

我確定括號是正確配對的。我真的試圖讓這個工作。任何進一步的指針將不勝感激。 – DC55