使用申请两个矩阵

时间:2018-12-02 13:55:41

标签: r plot

我是R语言的新手,不知道如何执行此操作。我有2个分别称为org(20x20矩阵)和param(2x20矩阵)的矩阵,我想将函数cdfgam应用于[org]的每一列,这需要[param]中的a和b列的参数:

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 :(得分:0)

最简单的解决方案是for循环,将结果存储在列表中。最困难的部分是保留您的名字JFE等。如果这是可选的,请执行以下操作:

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

(请注意,基于param[i,]的图片,您想要的是param[,i],而不是param,该图片显示的是3 x 2矩阵,而不是2 x 3矩阵。)

如果要保留这些名称,可以在末尾使用

添加它们
names(results) <- c("JFE", "FMA", "MAM")

并使用类似的代码

来引用它们
results[["FMA"]]

用于绘图,或像这样的循环

for (n in names(results))
  plot(results[[n]], main = paste("Results for", n))

答案 1 :(得分:0)

for循环效果很好,如果您真的想提高效率,仍然可以使用lapply:

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

在此示例中,效率差异最小,并且对于20行也是如此。 区别在于,在for循环的幕后,R首先将“结果”存储为空列表。
然后,“结果”的长度为1,因此需要在内存中放置另一个位置:将所有内容复制并存储新结果。
然后,“结果”的长度为2,因此需要在内存中放置另一个位置:所有内容都将被复制,并且新结果将被存储。
然后“结果”的长度为三,因此需要在内存中放置另一个位置:复制所有内容,并存储新结果。
...

首先,首先计算所有结果(并可能将其分散存储在内存中),然后再进行组合。另外,使用lapply可以使其他人更清楚地知道您正在执行独立计算,并且如果您确实希望可以将计算分为多个部分(例如在多个内核上运行)。