R中有两个主要索引的列表
我有一个带有三个参数(一个矩阵和两个参数)的函数,返回一个列表。我想为每个R中有两个主要索引的列表,r,list,function,loops,indices,R,List,Function,Loops,Indices,我有一个带有三个参数(一个矩阵和两个参数)的函数,返回一个列表。我想为每个a和b值存储函数值(这里是矩阵列表),以便从其索引中提取特定值 下面是一个简单的例子。(不工作,但解释情况) 我怎样才能做到这一点 ff <- function(X,a,b){ ff1 <- a*X+b ff2 <- (a+b)*colSums(X) list(ff1,ff2) } X <- matrix(c(10,15,20,25),2)
a
和b
值存储函数值(这里是矩阵列表),以便从其索引中提取特定值
下面是一个简单的例子。(不工作,但解释情况)
我怎样才能做到这一点
ff <- function(X,a,b){
ff1 <- a*X+b
ff2 <- (a+b)*colSums(X)
list(ff1,ff2)
}
X <- matrix(c(10,15,20,25),2)
a <- c(1,2,3)
b <- c(4,5,6,7)
res <- # ??????
for(i in 1:length(a)){
for(j in 1:length(b)){
res[??????] <- ff(X,a[i],b[j]) # WRONG
}
}
# WANT TO GET, for example
res[2,3] # = ff(X,a=2,b=6)
像这样的怎么样?这将返回
ff
返回对象的列表;每个列表
条目对应一个特定的a
,b
组合
res <- apply(as.data.frame(expand.grid(a, b)), 1, function(w)
ff(X, w[1], w[2]))
str(res)
#List of 12
# $ :List of 2
# ..$ : num [1:2, 1:2] 14 19 24 29
# ..$ : num [1:2] 125 225
# $ :List of 2
# ..$ : num [1:2, 1:2] 24 34 44 54
# ..$ : num [1:2] 150 270
# $ :List of 2
# ..$ : num [1:2, 1:2] 34 49 64 79
# ..$ : num [1:2] 175 315
# $ :List of 2
# ..$ : num [1:2, 1:2] 15 20 25 30
# ..$ : num [1:2] 150 270
# $ :List of 2
# ..$ : num [1:2, 1:2] 25 35 45 55
# ..$ : num [1:2] 175 315
# $ :List of 2
# ..$ : num [1:2, 1:2] 35 50 65 80
# ..$ : num [1:2] 200 360
# $ :List of 2
# ..$ : num [1:2, 1:2] 16 21 26 31
# ..$ : num [1:2] 175 315
# $ :List of 2
# ..$ : num [1:2, 1:2] 26 36 46 56
# ..$ : num [1:2] 200 360
# $ :List of 2
# ..$ : num [1:2, 1:2] 36 51 66 81
# ..$ : num [1:2] 225 405
# $ :List of 2
# ..$ : num [1:2, 1:2] 17 22 27 32
# ..$ : num [1:2] 200 360
# $ :List of 2
# ..$ : num [1:2, 1:2] 27 37 47 57
# ..$ : num [1:2] 225 405
# $ :List of 2
# ..$ : num [1:2, 1:2] 37 52 67 82
# ..$ : num [1:2] 250 450
a
和b
的长度如何不同?或者您想为a
和b
值的所有组合计算ff1
?我想为每个a[I]
,b[j]
计算ff1
,并将它们组合到一个列表res[I,j]
。结果是res
对象。当我调用res[I,j]
(或类似的东西)时,它应该返回ff(X,a[j],b[j])
。谢谢您的回复。但我也有类似的代码。我感兴趣的主要部分是call
阶段。我需要从它的索引中调用一个特定的结果。例如,res[i,j]
或res[[i,j]]
或类似的东西应该返回ff[X,a[i],b[j]
。因此,我可以在我拥有的更大的代码中使用它。在上面的示例中,从[[1]]
到[[12]]
的列表中只有一个主索引。。其形式应为1,1;1,2; 1,3; 1,4; 2,1; 2,2; 2,3….
@mert我建议重新考虑您的下游代码设计。将结果存储在列表中
是一种非常方便且符合R的方法,因为它允许使用*apply
系列中的方法进一步处理res
。这里的关键是expand.grid(a,b)
,它在data.frame
中存储所有a
,b
组合。每一行对应一个特定的a
,b
组合,对于每一行,我们计算ff(X,a,b)
,并将其输出存储在列表中。换句话说,res
的条目对应于expand.grid(a,b)
的行。这将允许您选择特定的a
,b
组合。@mert“在上面的示例中,从[[1]]
到[[12]]
的列表中只有一个主索引……”我不知道您的意思ff
返回您设计的列表
;我们计算不同组合的ff(X,a,b)
,b
。因此,res
的输出应该是list
的list
。这正是我的res
的结构。对不起,我无法解释我自己。我的想法就像矩阵(或数据框架)一样,包含列表元素。也就是说,res
应该是一个对象,它有两个维度,包含列表元素。但是,如果不可能,我将尝试按照您的建议将res
与expand.grid
的输出进行匹配。谢谢
library(tidyverse)
expand.grid(a, b) %>%
rowwise() %>%
mutate(res = list(ff(X, Var1, Var2))) %>%
ungroup() %>%
spread(Var1, res)
## A tibble: 4 x 4
# Var2 `1` `2` `3`
# <dbl> <list> <list> <list>
#1 4. <list [2]> <list [2]> <list [2]>
#2 5. <list [2]> <list [2]> <list [2]>
#3 6. <list [2]> <list [2]> <list [2]>
#4 7. <list [2]> <list [2]> <list [2]>