我经常需要写一些像
这样的东西sample_size = 10^4
my_data <- data.frame(x1 = runif(sample_size, 0,3), x2 = runif(sample_size, 0,3), x3 = runif(sample_size, 0,3), x4 = runif(sample_size, 0,3))
为了测试一些统计模型。例如,
error <- rnorm(sample_size, 0, 0.1)
y <- with( my_data, 2*x1+0.1*(x2 + x3 + x4)) + error
my_model <- lm(y ~ ., data = my_data)
由于my_data
用作lm
的输入,因此它必须是数据框(或列表)。
我想知道4次调用runif
是否是正确的方法,或者是否有更好的解决方案。我试过了
my_data <- matrix(4*runif(sample_size, 0,3), sample_size, 4, dimnames = list(NULL, paste0("x", 1:4)))
my_data <- as.data.frame(my_data)
但它对我来说似乎并不那么可读。
答案 0 :(得分:1)
有几种方法可以做到这一点。我们假设你想要ncol
列,这里有一些好方法:
ncol = 4
sample_size = 10
replicate(ncol, runif(sample_size, 0, 3))
matrix(runif(sample_size * ncol, 0, 3), ncol = ncol)
sapply(1:ncol, function(x) runif(sample_size, 0, 3))
这些创建矩阵,您当然可以根据需要转换为数据框。差异很小。 replicate
本质上是sapply
的一个不错的包装器。直接matrix
方法可能稍微更快,但差异可能是几毫秒。