2017-06-20 62 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