我模拟10次运行的混合数据。然后使用apply函数将我的函数应用于所有运行。现在我将得到10个不同的函数结果。我想将输出保存为矩阵,并选择我的列和行的名称。例如,我想获得如下输出:
dist = rnorm(n=100, m=2, sd=2.2)
rep. = function (dist) {
replicate(n=2, dist)
list(mean(dist), mode(dist),sd(dist)
}
我想找到模式,mean和sd作为2次运行的矩阵。那就是:
Iteration. Mean Mode sd
1 0.5. 3 0.4
2 0.3 1 0.6
请帮忙吗?
答案 0 :(得分:0)
以下功能是您想要的:
library(dplyr)
replicate(n = 2, expr = x <- rnorm(n = 100, mean = 2, sd = 2.2)) %>%
data.frame() %>%
summarize_all(c("mean", "sd"))
基础R中没有用于计算模式的功能,所以我建议你在here描述的单独函数中执行此操作。然而,在这种情况下计算模式没有多大意义,因为正态分布的均值=中值=模式。
答案 1 :(得分:0)
首先,基地R中没有函数mode()
所以我为你提供了一个:
mode <- function(x){
dd <- density(x)
dd$x[which.max(dd$y)]
}
其次,您需要将代码包装在复制调用中。您的代码对复制本身没有任何作用。它复制print(dist)
两次,然后只计算一次均值,模式和sd。
第三:如果你想对随机生成的向量进行此操作,rnorm()
调用也必须在复制内。
不要导出列表对象,让replicate
为您完成工作。
Forth:replicate()
默认返回带有名称的矩阵(如有必要)。这首先是simplify
和USE.NAMES
存在的论点。请记住,replicate
将结果作为列绑定在一起。所以要有一个矩阵,你有一个平均列,一个用于模式,一个用于sd,你需要转置它。
所以你想做什么,最好通过以下方式解决:
out <- replicate(n=2,{
x <- rnorm(n = 100, m = 2, sd = 2.2)
c(mean = mean(x),
mode = mode(x),
sd = sd(x)
)
})
t(out)