使用输出作为R中的数据帧写入for循环

时间:2017-01-27 08:47:53

标签: r for-loop

我目前正在研究“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]])
} 

我知道输出错误但不确定如何创建我需要的格式。任何帮助非常感谢。谢谢!

3 个答案:

答案 0 :(得分:2)

有很多方法可以做到这一点。这是一个。请参阅内联评论。

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

另一种方法是预先分配矩阵,添加值并将其强制转换为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)

答案 1 :(得分:2)

由于这是一个学习问题,我不会直接提供解决方案。

> values <- c(-10,0,10,100)
> for (i in seq_along(values)) {print(i)} # Checking we iterate by position
[1] 1
[1] 2
[1] 3
[1] 4
> output <- vector("double", 10) 
> output # Checking the place where the output will be
 [1] 0 0 0 0 0 0 0 0 0 0
> for (i in seq_along(values)) { # Testing the full code
+     output[[i]] <- rnorm(10, mean = values[[i]])
+ } 
Error in output[[i]] <- rnorm(10, mean = values[[i]]) : 
  more elements supplied than there are to replace

正如你所看到的那样,错误说要放置的元素多于空格(每次迭代生成10个随机数,(总共40个),你只有10个空格。考虑使用一种允许存储多个值的数据格式每次迭代。 那样:

> output <- ??
> for (i in seq_along(values)) { # Testing the full code
+     output[[i]] <- rnorm(10, mean = values[[i]])
+ } 
> output # Should have length 4 and each element all the 10 values you created in the loop

答案 2 :(得分:0)

# set the number of rows
rows <- 10

# vector with the values
means <- c(-10,0,10,100)

# generating output matrix
output <- matrix(nrow = rows,
             ncol = 4)

# setting seed and looping through the number of rows
set.seed(222)
for (i in 1:rows){
  output[i,] <- rnorm(length(means),
                  mean=means)
}

#printing the output
output