如何将函数的输出存储为r中具有特定列和行名称的矩阵?

时间:2017-03-13 10:15:04

标签: r

我模拟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

请帮忙吗?

2 个答案:

答案 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()默认返回带有名称的矩阵(如有必要)。这首先是simplifyUSE.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)