используя подать заявку на две матрицы - PullRequest
0 голосов
/ 02 декабря 2018

Я новичок в R и не знаю, как это сделать.У меня есть 2 матрицы с именем org (матрица 20x20) и param (матрица 2x20) соответственно, и я хочу применить функцию cdfgam к каждому столбцу [org], для которого требуются параметры столбца a и b из [param]:

org:

[1    4    7]
[2    5    8]
[3    6    9]

param

 a    b
[1    4]
[2    5]
[3    6]

Я использую:

JFE<-cdfgam(org[,1],para=(param[,1]))
FMA<-cdfgam(org[,2],para=(param[,2]))
MAM<-cdfgam(org[,3],para=(param[,3]))

Есть ли способ выполнить это только с помощью строкового кода?Также для того, чтобы подготовить их позже?

Спасибо

Ответы [ 2 ]

0 голосов
/ 02 декабря 2018

Цикл for работает хорошо, если вы действительно хотите эффективность, вы все равно можете использовать lapply:

results <- lapply(1:nrow(org), function(i) cdfgam(org[,i], para = param[i,]))
names(results) <- c("JFE", "FMA", "MAM")

В этом примере разница эффективности минимальна, и она также будет для 20 строк.Разница в том, что в цикле for под капотом R сначала сохраняет «результаты» как пустой список.
Затем «результаты» получают длину один, поэтому ему нужно другое место в памяти: все копируется, иновый результат сохраняется.
Тогда «results» получает длину два, поэтому ему нужно другое место в памяти: все копируется, а новый результат сохраняется.
Тогда «results» получает длину три, поэтому ему нужнодругое место в памяти: все копируется, и новый результат сохраняется.
...

Вначале все результаты вычисляются (и, возможно, хранятся в памяти), а затем объединяются.Кроме того, использование lapply делает понятным для других, что вы делаете независимые вычисления, и если вы действительно хотите, вы можете разрезать вычисления на части (например, работать на нескольких ядрах).

0 голосов
/ 02 декабря 2018

Самое простое решение - цикл for, в котором результаты сохраняются в виде списка.Самым сложным будет сохранить ваши имена JFE и т. Д. Если это не является обязательным, сделайте это следующим образом:

results <- list()
for (i in 1:3) results[[i]] <- cdfgam(org[,i], para = param[i,])

(Обратите внимание, что вы хотите param[i,], а не param[,i], основываясь на вашей картинеparam, который показывает матрицу 3 на 2, а не 2 на 3.)

Если вы хотите сохранить эти имена, вы можете добавить их в конце, используя

names(results) <- c("JFE", "FMA", "MAM")

и обращайтесь к ним, используя код типа

results[["FMA"]]

для построения графика или в цикле, подобном

for (n in names(results))
  plot(results[[n]], main = paste("Results for", n))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...