我难以对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;在此列表之外?
答案 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})
表达式分成三部分。我不知道为什么数字版本不会因此而犯规。