首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在带有变量的quantmod中使用子集运算符::

在带有变量的quantmod中使用子集运算符::
EN

Stack Overflow用户
提问于 2016-08-27 06:22:24
回答 3查看 656关注 0票数 0

如何应用用户初始化的日期变量作为R-package,quantmod中的子集运算符::的起始值和结束值?

例如,当我应用用户初始化日期变量时,

代码语言:javascript
复制
end.date        <- Sys.Date()
start.date      <- end.date - 5*365 #5- years to-date
start.date.char <- as.character(start.date)
end.date.char   <- as.character(end.date)

获取5年的股票数据

代码语言:javascript
复制
library(quantmod)
getSymbols("GILD",src="yahoo")
GILD.5YTD <- GILD['start.date.char::end.date.char']

我得到以下错误:

代码语言:javascript
复制
Error in if (length(c(year, month, day, hour, min, sec))
   == 6 && c(year,  :
 missing value where TRUE/FALSE needed

此外:警告消息:

代码语言:javascript
复制
1: In as_numeric(YYYY) : NAs introduced by coercion
2: In as_numeric(MM) : NAs introduced by coercion
3: In as_numeric(DD) : NAs introduced by coercion
4: In as_numeric(YYYY) : NAs introduced by coercion
5: In as_numeric(MM) : NAs introduced by coercion
6: In as_numeric(DD) : NAs introduced by coercion

我确信这是一个基本的问题,但我是个新手。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-08-27 15:28:03

有一些方便的高级函数可以将xts对象子集为返回的对象,例如,由quantmod的getSymbols()返回。

对于基于时间的子集,xts包中的last()函数(由quantmod自动加载)非常方便:

代码语言:javascript
复制
library(quantmod)
getSymbols("GILD",src="yahoo")
GILD_last5Years <- last(GILD, "5 years")
#> head(GILD_last5Years)
#           GILD.Open GILD.High GILD.Low GILD.Close GILD.Volume GILD.Adjusted
#2012-01-03     41.46     41.99    41.35      41.86    19564000      20.46895
#2012-01-04     41.95     42.06    41.70      42.02    16236000      20.54719
#2012-01-05     42.04     42.97    42.00      42.52    18431800      20.79168
#2012-01-06     42.38     43.10    42.20      42.78    15542000      20.91882
#2012-01-09     42.49     42.99    42.35      42.73    16801200      20.89437
#2012-01-10     43.10     45.04    42.94      44.25    30110000      21.63763

这可以与等效函数first()结合使用,以选择序列中的特定时间跨度。

票数 2
EN

Stack Overflow用户

发布于 2016-08-27 08:07:33

您当前对[.xts的参数只是字符值'start.date.char::end.date.char',不会进一步求值,因为R不是宏语言。相反,尝试构建所需的字符值,我认为是:"2011-08-28::2016-08-26"。所以这是成功的:

代码语言:javascript
复制
GILD.5YTD<-GILD[paste(start.date.char, end.date.char, sep="::")]

str(GILD.5YTD)
#-------
An ‘xts’ object on 2011-08-29/2016-08-25 containing:
  Data: num [1:1257, 1:6] 39 39.7 40.2 39.8 39 ...
 - attr(*, "dimnames")=List of 2
  ..$ : NULL
  ..$ : chr [1:6] "GILD.Open" "GILD.High" "GILD.Low" "GILD.Close" ...
  Indexed by objects of class: [Date] TZ: UTC
  xts Attributes:  
List of 2
 $ src    : chr "yahoo"
 $ updated: POSIXct[1:1], format: "2016-08-26 17:00:52"

因此,从技术上讲,::并不充当R运算符,而是由[.xts函数解析。Pkg:quantmod构建在xts;包之上。"::"函数实际上是用于对已安装包的导出函数进行包导向函数访问。

票数 1
EN

Stack Overflow用户

发布于 2016-08-29 14:51:34

错误的原因是您正在提交字符串中的变量,而该字符串无法工作。(顺便说一句,您不必像在示例中那样将日期转换为as.character,因为粘贴将为您完成此操作)。像这样使用paste0将相应地设置您的数据子集:

代码语言:javascript
复制
GILD.5YTD<-GILD[paste0(start.date.char,'::',end.date.char)]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39175401

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档