我是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]))
有没有一种方法可以仅使用一行代码来执行此操作?还可以稍后再绘制吗?
谢谢
答案 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可以使其他人更清楚地知道您正在执行独立计算,并且如果您确实希望可以将计算分为多个部分(例如在多个内核上运行)。