JSON子集R中的唯一日期

时间:2017-06-20 20:02:00

标签: 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)

数据看起来像是这样(2天值4394天)。我遇到的麻烦是每个日期都是独一无二的,我无法弄清楚如何只提取日期和其中一个子集价格。

> 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个元素的大型列表。 我如何获得&#34; date&#34;并且&#34;调整得很近&#34;在此列表之外?

1 个答案:

答案 0 :(得分: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})表达式分成三部分。我不知道为什么数字版本不会因此而犯规。