我可以使用以下MyFun
(用户定义)函数来模拟观察。但是当函数返回输出列表时,无法弄清楚如何用replicate
函数重复此函数。
MyFun <- function(nSim, Size, Prob) {
M1 <- t(mapply(rbinom, prob = Prob, n = nSim, size = Size))
dimnames(M1) <- list(Prob, paste0("V", 1:nSim))
MeanM1 <- M1/Size
Results1 <- list(M1, MeanM1)
return(Results1)
}
MyFun(nSim=5, Size=4, Prob=c(0.2, 0.4))
[[1]]
V1 V2 V3 V4 V5
0.2 2 2 1 2 1
0.4 2 3 0 3 1
[[2]]
V1 V2 V3 V4 V5
0.2 0.5 0.50 0.25 0.50 0.25
0.4 0.5 0.75 0.00 0.75 0.25
但是没有使用replicate
函数给出所需的结果。
replicate(
n=2
, MyFun(nSim=5, Size=2, Prob=c(0.2, 0.4))
, simplify = "array"
)
[,1] [,2]
[1,] Integer,10 Integer,10
[2,] Numeric,10 Numeric,10
答案 0 :(得分:3)
你的功能确实有效,它只有一个奇怪的&#34;输出。尝试将结果存储到名为aa
的对象中。
aa <- replicate(
+ n=2
+ , MyFun(nSim=5, Size=2, Prob=c(0.2, 0.4))
+ , simplify = T
+ )
aa
[,1] [,2]
[1,] Integer,10 Integer,10
[2,] Numeric,10 Numeric,10
但是那个2 x 2矩阵的每个元素本身就是一个矩阵。试试这个:
class(aa)
[1] "matrix"
sapply(aa, class)
[1] "matrix" "matrix" "matrix" "matrix"
事实上,如果你提取第一个&#34;单元&#34;在前面的矩阵中,您会看到这是一个包含MyFun
输出的矩阵:
aa[1,1]
[[1]]
V1 V2 V3 V4 V5
0.2 0 1 0 0 1
0.4 1 2 0 2 0
答案 1 :(得分:3)
尝试向您的函数添加简化参数,并将其传递给mapply()
。
MyFun <- function(nSim, Size, Prob, simplify = "array") {
M1 <- t(
mapply(rbinom, prob = Prob, n = nSim, size = Size, SIMPLIFY = simplify)
)
dimnames(M1) <- list(Prob, paste0("V", 1:nSim))
MeanM1 <- M1/Size
Results1 <- list(M1, MeanM1)
return(Results1)
}
然后使用simplify = FALSE
中的replicate()
调用它。这将生成一个长度为2的列表,其中包含每个元素两个数组的列表。
replicate(2, MyFun(nSim=5, Size=2, Prob=c(0.2, 0.4)), simplify = FALSE)
[[1]]
[[1]][[1]]
V1 V2 V3 V4 V5
0.2 1 0 2 0 0
0.4 2 0 1 1 0
[[1]][[2]]
V1 V2 V3 V4 V5
0.2 0.5 0 1.0 0.0 0
0.4 1.0 0 0.5 0.5 0
[[2]]
[[2]][[1]]
V1 V2 V3 V4 V5
0.2 0 0 0 0 1
0.4 2 1 1 1 0
[[2]][[2]]
V1 V2 V3 V4 V5
0.2 0 0.0 0.0 0.0 0.5
0.4 1 0.5 0.5 0.5 0.0