Как создать цикл, который изменяет имя данных во время каждого цикла?

Это пример кода, который использует аналогичный набор данных:

library(portfolio)
p <- new("portfolioBasic", instant = as.Date("2004-12-31"), id.var = "symbol",  
         in.var = "price", sides = "long", 
         ret.var = "month.ret", data = dow.jan.2005)
a <- performance(p)@ret
b <- log(1 + a)
sum <- b + sum #the sum variable should accumulate all returns

Приведенный выше пример очень похож на код, над которым я работаю, за исключением того, что он использует dow.jan.2005, включенный в библиотеку portfolio.

Я хочу создать цикл в R, который вычисляет определенную функцию p <- new(... , data = "data20xx"), и этот data20xx, который используется в функции, должен работать с 2007 по 2017 год.

Есть также две другие функции, следующие за p. Функция производительности performance(p) вычисляет процент, который затем необходимо логарифмировать и сохранить в отдельной переменной b. Переменные sum отслеживают совокупные результаты журнала.

Вот описание функции performance:

   Formal class 'performance' [package "portfolio"] with 6 slots
      ..@ ret           : num -0.366
      ..@ profit        : num 0
      ..@ missing.price : num NA
      ..@ missing.return: int 0

Если я использую performance(p)@ret, я получаю число, но не могу использовать его логарифм.

Как я могу создать этот конкретный цикл?

Обращаясь за помощью, вы должны включить простой воспроизводимый пример с образцом ввода и желаемым выходом, который можно использовать для тестирования и проверки возможных решений.

MrFlick 02.05.2018 20:40

о чувак! Я хочу помочь тебе, но не могу. Вам следует предоставить дополнительную информацию.

YOLO 02.05.2018 20:48

Я обновил свой первоначальный пост примером

Lumberjack88 02.05.2018 21:28

Вы знаете о простом математическом факте, что нет определенного значения для журнала отрицательного числа ????

IRTFM 02.05.2018 21:37

Для первой проблемы вы можете использовать список как data <- list(data2007, ..., data2017) и либо использовать lapply, либо цикл с data = data[[i]].

DJack 02.05.2018 21:51

@ 42 Извините, я пропустил эту часть. Теперь я добавил правильную формулу возврата журнала.

Lumberjack88 02.05.2018 22:27

@DJack, не могли бы вы привести полный пример?

Lumberjack88 02.05.2018 22:28
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
7
67
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Подход состоит в том, чтобы поместить ваши фреймы данных в список и применить вашу функцию к каждому элементу этого списка с помощью lapply.

data <- list(data2005, data2006, data2007)

myfun <- function(x){
  p <- new("portfolioBasic", 
           instant = as.Date("2004-12-31"), 
           id.var = "symbol", in.var = "price",
           sides = "long", ret.var = "month.ret", data = x)
  a <- performance(p)@ret
  b <- log(1 + a)
  b
}

output <- lapply(data, myfun)

sum <- do.call("sum", output)

Пример данных

library(portfolio)

set.seed(1)

data(dow.jan.2005)

data2007 <- data2006 <- data2005 <- dow.jan.2005
data2006$price <- runif (nrow(dow.jan.2005), 30, 100)
data2007$price <- runif (nrow(dow.jan.2005), 30, 100)

Вот мой собственный ответ, который я придумал после предложений DJack (спасибо DJack!):

mydata <- list(spxdata2007,spxdata2008 etc.)
p <- lapply(mydata, function(x) log(1+performance(new("portfolioBasic", id.var = "symbol", in.var = "inversepe", type = "linear", sides = c("long", "short"), ret.var = "return", data = x))@ret))
exp(Reduce("+",p))-1

Другие вопросы по теме