我目前正在研究“ R for Data Science”一书。
我正在尝试解决此练习问题(21.2.1 Q1.4),但在启动for循环之前无法确定正确的输出。
将for循环编写为:为?=?10、0、10和100中的每一个生成10个随机法线。
就像本书中以前的问题一样,我一直试图将其插入向量输出中,但是对于本示例,看来我需要将输出作为数据框?
到目前为止,这是我的代码:
values <- c(-10,0,10,100)
output <- vector("double", 10)
for (i in seq_along(values)) {
output[[i]] <- rnorm(10, mean = values[[i]])
}
Run Code Online (Sandbox Code Playgroud)
我知道输出错误,但是不确定如何在此处创建所需的格式。任何帮助,不胜感激。谢谢!
有很多方法可以做到这一点。这是一个。查看内联注释。
set.seed(357) # to make things reproducible, set random seed
N <- 10 # number of loops
xy <- vector("list", N) # create an empty list into which values are to be filled
# run the loop N times and on each loop...
for (i in 1:N) {
# generate a data.frame with 4 columns, and add a random number into each one
# random number depends on the mean specified
xy[[i]] <- data.frame(um10 = rnorm(1, mean = -10),
u0 = rnorm(1, mean = 0),
u10 = rnorm(1, mean = 10),
u100 = rnorm(1, mean = 100))
}
# result is a list of data.frames with 1 row and 4 columns
# you can bind them together into one data.frame using do.call
# rbind means they will be merged row-wise
xy <- do.call(rbind, xy)
um10 u0 u10 u100
1 -11.241117 -0.5832050 10.394747 101.50421
2 -9.233200 0.3174604 9.900024 100.22703
3 -10.469015 0.4765213 9.088352 99.65822
4 -9.453259 -0.3272080 10.041090 99.72397
5 -10.593497 0.1764618 10.505760 101.00852
6 -10.935463 0.3845648 9.981747 100.05564
7 -11.447720 0.8477938 9.726617 99.12918
8 -11.373889 -0.3550321 9.806823 99.52711
9 -7.950092 0.5711058 10.162878 101.38218
10 -9.408727 0.5885065 9.471274 100.69328
Run Code Online (Sandbox Code Playgroud)
另一种方法是预分配矩阵,添加值并将其强制到data.frame。
xy <- matrix(NA, nrow = N, ncol = 4)
for (i in 1:N) {
xy[i, ] <- rnorm(4, mean = c(-10, 0, 10, 100))
}
# notice that i name the column names post festum
colnames(xy) <- c("um10", "u0", "u10", "u100")
xy <- as.data.frame(xy)
Run Code Online (Sandbox Code Playgroud)