在R中编写许多嵌套for循环的替代指令是什么?
我有29个矩阵。我需要编写29个嵌套循环,在最后一个循环中,我应该调用29个单词字符串上的函数。但是写29个循环很耗时。另外,我必须在另一个在R中编写许多嵌套for循环的替代指令是什么?,r,string,for-loop,matrix,R,String,For Loop,Matrix,我有29个矩阵。我需要编写29个嵌套循环,在最后一个循环中,我应该调用29个单词字符串上的函数。但是写29个循环很耗时。另外,我必须在另一个Rcode中重复此过程。我正在寻找实现这些循环的替代方法。 我解释的代码如下m1tom29是矩阵,而make_rule_antc是我在矩阵的每个元素上调用的函数: for (i1 in 1:nrow(m1)){ for (i2 in 1:nrow(m2)){ for (i3 in 1:nrow(m3)){
R
code中重复此过程。我正在寻找实现这些循环的替代方法。
我解释的代码如下m1
tom29
是矩阵,而make_rule_antc
是我在矩阵的每个元素上调用的函数:
for (i1 in 1:nrow(m1)){
for (i2 in 1:nrow(m2)){
for (i3 in 1:nrow(m3)){
.
.
.
for (i29 in 1:nrow(m29)){
make_rule_antc(m1[i1,],m2[i2,],m3[i3,],...,m29[i29,])
}
}
}
}
我认为应该是这样的:
m1=matrix(c(1,2,3,4), nrow = 2)
m2=matrix(c(1,2,3,4), nrow = 2)
m3=matrix(c(1,2,3,4), nrow = 2)
ms=list(m1,m2,m3)
idx=expand.grid(lapply(ms,FUN=function(x) seq(1,nrow(x))))
body=function(x) {
arglist=list()
for (i in 1:length(x))
arglist[[i]]=ms[[i]][x[i],]
do.call(make_rule_antc, arglist)
}
apply(idx,MARGIN = 1, FUN=body)
我认为应该是这样的:
m1=matrix(c(1,2,3,4), nrow = 2)
m2=matrix(c(1,2,3,4), nrow = 2)
m3=matrix(c(1,2,3,4), nrow = 2)
ms=list(m1,m2,m3)
idx=expand.grid(lapply(ms,FUN=function(x) seq(1,nrow(x))))
body=function(x) {
arglist=list()
for (i in 1:length(x))
arglist[[i]]=ms[[i]][x[i],]
do.call(make_rule_antc, arglist)
}
apply(idx,MARGIN = 1, FUN=body)
@cyberj0g解决方案可以简化为这样
m1 <- matrix(c(1,2,3,4), nrow = 2)
m2 <- matrix(c(1,2,3,4), nrow = 2)
m3 <- matrix(c(1,2,3,4), nrow = 2)
ms <- list(m1, m2, m3)
rows <- sapply(ms, nrow)
combination <- expand.grid(lapply(rows, seq_len))
apply(combination, 1, function(x){
do.call(make_rule_antc, as.list(x))
})
m1@cyberj0g解决方案可以简化为
m1 <- matrix(c(1,2,3,4), nrow = 2)
m2 <- matrix(c(1,2,3,4), nrow = 2)
m3 <- matrix(c(1,2,3,4), nrow = 2)
ms <- list(m1, m2, m3)
rows <- sapply(ms, nrow)
combination <- expand.grid(lapply(rows, seq_len))
apply(combination, 1, function(x){
do.call(make_rule_antc, as.list(x))
})
m1你能详细说明你想做什么吗?我们的矩阵有多大?一个更好的方法可能是先做一些数据重塑。你能详细说明你想要做什么吗?我们的矩阵有多大?更好的方法可能是先进行一些数据重塑。如果nrow(x)=0,这将失败。如果nrow(x)=0,这将失败。您只是将索引传递给OP的make_rule_antc
,而不是实际的矩阵行。不过,我相信我的解决方案可以简化。你和@cyberj0g能解释一下为什么m1、m2和m3是这样生成的吗?我有29个矩阵。我应该如何在代码中使用它们?既然已经有m1…m29,只需将它们添加到ms
中的列表中,如下所示:ms=list(m1,m2,m3,m4,…,m29)您只是将索引传递给OP的make_rule_antc
,而不是实际的矩阵行。不过,我相信我的解决方案可以简化。你和@cyberj0g能解释一下为什么m1、m2和m3是这样生成的吗?我有29个矩阵。我应该如何在您的代码中使用它们?假设您已经有m1…m29,只需将它们添加到ms
中的列表中,如下所示:ms=list(m1,m2,m3,m4,…,m29)