【问题标题】:Createa loop for new values in new df in R为 R 中的新 df 中的新值创建一个循环
【发布时间】:2020-10-09 16:42:35
【问题描述】:

我有一个 1500 obs 的 df。和 100 个变量。 这些是股票,我想计算所有 100 股的 EMA50 并将它们放在新的 df 中。我想把它放在一个循环中,因为我想在那之后绘制每个共享+结果。不过剧情暂时不重要。为了更好地展示整个过程,我做了一个例子:(可能有一个更简单的方法来编写这个例子,但我正在学习中,还在学习用 R 编写代码。)

library(tidyverse)
library(quantmod)
library(fPortfolio)
library(PerformanceAnalytics)
#
DStart <-  "2016-01-01" 
DEnd <-  "2020-12-31" 
#
#loading DAX and MDAX Index data from Yahoo Finance
TSLA <-  getSymbols("TSLA", src="yahoo", from=DStart, to=DEnd,  auto.assign=FALSE) 
AAPL <- getSymbols("AAPL", src="yahoo", from=DStart, to=DEnd,  auto.assign=FALSE)
AMZN <- getSymbols("AMZN", src="yahoo", from=DStart, to=DEnd,  auto.assign=FALSE)
#
Closing <- merge(TSLA, AAPL, AMZN)
#
write.zoo(Closing, file="Closing.csv", sep=",", dec="." )
#
df_Closing <- Closing[,-c(1,2,3,5,6,7,8,9,11,12,13,14,15,17,18)]

我现在有一个 df 中的所有收盘价,就像我的真实 df 一样。 对于我使用的 EMA 的单独计算:

df_Closing$TSLA_EMA50 = EMA(df_Closing$TSLA.Close,50)

在搜索过程中,我遇到了几个解决方案,直到现在都以错误消息结尾。 我的最后一次尝试是这样的:

df_EMA50 <- df_Closing
for (i in names(df_Closing)) {
  j <- EMA(df_Closing$i,50)
  new_df[i] <- j$EMA50
}

【问题讨论】:

    标签: r loops time-series


    【解决方案1】:

    按位置而不是按名称进行迭代通常更容易。输出data.frame 应初始化为空,以便更容易识别问题并确保预期输出。

    df_EMA50 <- df_Closing[0, ]
    for (i in seq_len(ncol(df_Closing))) {
      j <- EMA(df_Closing[, i], 50)
      colnames(j) <- colnames(df_Closing[, i])
      df_EMA50 <- cbind(df_EMA50, j)
    }
    

    【讨论】:

    • 完美。谢谢!是否有可能实现它的情节?所以它用 EMA50 为每只股票绘制了一个图?
    • @Qncy 您可以同时或在后续步骤中生成图。使用plot 将显示并允许保存到图片。如果您需要保存绘图,那么您可能需要查看ggplot2
    • 谢谢。我刚刚为我的真实df收到此错误atm:data.frame中的错误(...,check.names = FALSE):参数意味着不同的行数:0、1520也许您也有解决方案。 @manotheshark。我只是看到我的 i 值只是 1L 而不是 96
    • i 的值为1L 表示它可能在第一次迭代中失败。单步执行循环的每一步;我最初的猜测是 data.frames 和 cbind 有问题。
    猜你喜欢
    • 1970-01-01
    • 2020-11-28
    • 2020-09-10
    • 2021-12-08
    • 2011-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-02
    相关资源
    最近更新 更多