【问题标题】:I got an error when I run my codes in R Studio在 R Studio 中运行代码时出现错误
【发布时间】:2020-05-30 05:24:44
【问题描述】:

这是我使用的代码

library(quantmod)
library(timetk)
library(dplyr)
library(tibble)
library(tidyr)


mdate <- "2015-10-30"
edate <- "2016-01-05"

tickers <- c("ABG","ACH","ADM","AEG","AEM","AGQ","AGRO","AKOb","APO")


data <- do.call(cbind.data.frame, lapply(tickers, function(x) 
  getSymbols(x, from = mdate, to = edate, auto.assign = F)))


# Transpose data.frame: 
td_data <- within(data.frame(price_var = row.names(t(data)), t(data), row.names = NULL), 
                  {
                    ticker_cd <- as.factor(gsub("[.].*", "", price_var))
                    price_var <- as.factor(gsub(".*[.]", "", price_var))
                  }
)
# Reshape: 
abc <- do.call("cbind", split(td_data, td_data$price_var))

当我运行这些时,我得到了:

data.frame(..., check.names = FALSE) 中的错误: 参数暗示不同的行数:44、38 另外:警告信息: AKOb 包含缺失值。如果对象在系列中间包含缺失值,则某些功能将不起作用。考虑使用 na.omit()、na.approx()、na.fill() 等来删除或替换它们。

我发现这个错误是由“AKOB”引起的。第一天和第六天的数据是空白的,所以“AKOB”的第一天是2015年11月9日,这与其他股票数据不同。我找到的方法是一个一个运行,比较它们的差异。每当发生这种情况时,这是一种非常低效的方式。

如果股票在我的设置中没有数据(从开始日期到结束日期),我想跳过 我该怎么做?

【问题讨论】:

  • 将行分成单独的部分,以便lapply( ... ) 的结果作为对象返回。然后在该对象上使用lapply 来检查每张票的空白值,并在调用cbind.data.frame 之前删除有空白的值。
  • @Dongchul Park 我不确定你想要达到什么目的。您想插补、插值、完全删除 AKOB 还是保留 NA 值?如果是后者(请参阅下面的解决方案)。
  • @hello_friend,我想做的是我不想在最终输出“abc”中包含 AKOB,因为这个代码不适用。换句话说,我想在“abc”中导入“ABG”、“ACH”、“ADM”、“AEG”、“AEM”、“AGQ”、“AGRO”、“APO”的数据。无论如何,您在下面编写的代码对我来说非常有用。
  • 接受我的解决方案,如果它满足您的要求
  • @DongchulPark 请在下面查看我的解决方案,如果它满足您的要求,请接受它。

标签: r data-wrangling


【解决方案1】:
library(quantmod)

mdate <- "2015-10-30"
edate <- "2016-01-05"

tickers <- c("ABG","ACH","ADM","AEG","AEM","AGQ","AGRO","AKOb","APO", "JJE")

# Iterate through the tickers and retrieve data from Yahoo Finance defensively: data => xts
data <- do.call("cbind", lapply(seq_along(tickers), function(i){
        try_var <- try(getSymbols(tickers[i], from = mdate, to = edate, auto.assign = FALSE))
        if(inherits(try_var, "try-error")) {
          i <- i + 1
        } else{
          getSymbols(tickers[i], from = mdate, to = edate, auto.assign = FALSE)   
        }
      }
    )
  )



# Transpose data.frame: td_data => data.frame
td_data <- within(data.frame(price_var = row.names(t(data)), t(data), row.names = NULL), 
                  {
                    ticker_cd <- as.factor(gsub("[.].*", "", price_var))
                    price_var <- as.factor(gsub(".*[.]", "", price_var))
                  }
                )

# Re-order vectors; keep complete cases: td_data_o => data.frame
td_data_o <- td_data[complete.cases(td_data), 
                     c(names(td_data)[sapply(td_data, is.factor)],  
                       names(td_data)[sapply(td_data, function(x){!is.factor(x)})])]

# Reshape: abc => data.frame
abc <- do.call("cbind", split(td_data_o, td_data_o$price_var))

【讨论】:

    猜你喜欢
    • 2015-08-02
    • 2013-07-16
    • 1970-01-01
    • 2016-04-15
    • 2018-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多