Создайте l oop для новых значений в новом df в R - PullRequest
1 голос
/ 19 июня 2020

У меня дф с 1500 набс. и 100 переменных. Это акции, и я хотел бы рассчитать EMA50 для всех 100 акций и поместить их в новый df. Я хотел бы поместить это в al oop, потому что я хочу построить график каждой доли + результат после этого. Но сюжет пока не важен. Чтобы лучше показать весь процесс, я привел пример: (Возможно, есть более простой способ закодировать этот пример, но я нахожусь в середине учебы и все еще учусь кодировать на 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
}

1 Ответ

1 голос
/ 19 июня 2020

Обычно проще выполнять итерацию по позиции, а не по имени. Выход 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)
}
...