如何解决R:if else 语句将列作为整个向量处理
我有一个数据集,我想用 tq_get
计算股票 6 个月的回报(见下面的例子)
名为 top
的数据集
ticker 6month
AKO.A
BIG
BGFV
library(tidyverse)
library(dplyr)
library(tidyquant)
library(riingo)
calculate <- function (x) {
(tq_get(x,get = "tiingo",from = yesterday,to = yesterday)$adjusted/tq_get(x,from = before,to = before)$adjusted)-1
}
top[2] <- lapply(top[1],function(x) calculate(x))
不幸的是,对于某些股票代码,当简单地使用 lapply
或 mutate
时,没有值会导致错误消息,因为结果向量比现有数据集更小(行数更少)。使用 try_catch
解决没有用。
我现在想通过检查包 is_supported_ticker()
提供的 riingo
是否有可用的代码来解决问题
calculate <- function (x) {
if (is_supported_ticker(x,type = "tiingo") == TRUE) {
(tq_get(x,to = before)$adjusted)-1
}
else {
NA
}
}
top[2] <- lapply(top[1],function(x) calculate(x))
但现在我收到错误消息 x ticker must be length 1,but is actually length 3
。
我认为这是基于这样一个事实,即我的数据集的整个第一列都用作 is_supported_ticker()
的输入,而不是逐行输入。我该如何解决这个问题?
解决方法
看文档,好像tq_get
支持多个符号,只有if_supported_ticker
一次一个。因此,您可能应该检查所有代码以查看它们是否受支持,然后在所有受支持的代码上使用一次 tq_get
。像这样的东西(未经测试,因为我没有这些软件包中的任何一个):
calculate <- function (x) {
supported = sapply(x,is_supported_ticker,type = "tiingo")
result = rep(NA,length(x))
result[supported] =
(
tq_get(x[supported],get = "tiingo",from = yesterday,to = yesterday)$adjusted /
tq_get(x[supported],from = before,to = before)$adjusted
) - 1
return(result)
}
让我担心的是 before
和 yesterday
不是函数参数 - 它们只是假设存在于全局环境中。我建议将它们作为参数传递给 calculate()
,如下所示:
calculate <- function (x,before,yesterday) {
supported = sapply(x,to = before)$adjusted
) - 1
return(result)
}
# then calling it
calculate(top$ticker,before = <...>,yesterday = <...>)
通过这种方式,您可以动态地为 before
和 yesterday
传递值。如果它们是您的全局环境中的对象,您可以简单地使用 calculate(top$ticker,yesterday)
,但它可以让您自由地改变这些参数,而无需在您的全局环境中重新定义这些名称。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。