我可以使用runif函数生成20个均匀分布的观测值: runif(n=20)
并且可以生成100个同样分布的重复实验,具体如下。
df <- replicate( 100, runif(n=20))
这将创建一个维度为
[20,100]
的矩阵df
,我可以将其转换为具有100列和20行的数据框。如何生成由
df
每列均值组成的新数据框?谢谢您的帮助。
我可以使用runif函数生成20个均匀分布的观测值: runif(n=20)
并且可以生成100个同样分布的重复实验,具体如下。
df <- replicate( 100, runif(n=20))
[20,100]
的矩阵df
,我可以将其转换为具有100列和20行的数据框。df
每列均值组成的新数据框?colMeans
。data <- replicate(100, runif(n=20))
means <- colMeans(data)
.colMeans()
。根据说明,这些函数是“用于需要最终速度的编程中”。 - tim riffedata <- 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)
colMeans
、rowMeans
、colSums
和 rowSums
通常比它们的 apply
等效函数执行速度更快,尽管对于大多数情况来说,性能损失并不会太大(显然取决于您的数据大小...)。 - Chase?colMeans
的帮助页面以获取详细信息,但基本上这些函数是“为了速度而编写”,比apply
函数少进行错误检查。我希望我自己更好地理解这些细节... - ChasecolMeans
花费了约0.1秒,而apply
则需要约3.2秒。 - nico在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
apply(replicate(100,runif(n=20)),2,mean)
意思是将20个随机数复制100次,然后对每列进行平均值计算。