在R中,如何生成一个数据集,其中包含数据框的所有列的平均值?

6

我可以使用runif函数生成20个均匀分布的观测值: runif(n=20) 并且可以生成100个同样分布的重复实验,具体如下。

df <- replicate( 100, runif(n=20))

这将创建一个维度为[20,100]的矩阵df,我可以将其转换为具有100列和20行的数据框。
如何生成由df每列均值组成的新数据框?
谢谢您的帮助。

2
小细节:在R中,它们是函数,而不是命令! - Spacedman
4个回答

11
你可以使用 colMeans
data <- replicate(100, runif(n=20))
means <- colMeans(data)

3
R 2.15+还包括.colMeans()。根据说明,这些函数是“用于需要最终速度的编程中”。 - tim riffe

5

生成数据:

data <- replicate(100, runif(n=20))

列和行的意义:

col_mean <- apply(data, 2, mean)
row_mean <- apply(data, 1, mean)

列、行的标准差

col_sd   <- apply(data, 2, sd)
row_sd   <- apply(data, 1, sd)

1
colMeansrowMeanscolSumsrowSums 通常比它们的 apply 等效函数执行速度更快,尽管对于大多数情况来说,性能损失并不会太大(显然取决于您的数据大小...)。 - Chase
请查看?colMeans的帮助页面以获取详细信息,但基本上这些函数是“为了速度而编写”,比apply函数少进行错误检查。我希望我自己更好地理解这些细节... - Chase
在一个10000 x 10000的矩阵上,colMeans花费了约0.1秒,而apply则需要约3.2秒。 - nico

2

在Nico的回答基础上,你可以只调用一次runif(),将其格式化为矩阵,然后对其进行列均值计算。这样做更快且与其他答案等效。

library(rbenchmark)
#reasonably fast
f1 <- function() colMeans(replicate(100,runif(20)))
#faster yet
f2 <- function() colMeans(matrix(runif(20*100), ncol = 100))

benchmark(f1(), f2(), 
          order = "elapsed", 
          columns = c("test", "elapsed", "relative"),
          replications=10000)

#Test results
  test elapsed relative
2 f2()    0.91 1.000000
1 f1()    5.10 5.604396

2
如果我理解正确: apply(replicate(100,runif(n=20)),2,mean) 意思是将20个随机数复制100次,然后对每列进行平均值计算。

亲爱的frankc:非常感谢您的帮助-我尝试了您的建议,确实像魔法一样奏效。 - user1357062

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接