首页 > 解决方案 > 从 for 循环打印到新的数据帧

问题描述

我正在尝试使用 for 循环在新数据框中打印新列。我已经构建了 for 循环,并让它们在控制台中打印我想要的内容,但是将这些结果放入新的数据帧中非常费时。我尝试使用正确的行数制作一个空白矩阵,目的是在执行 for 循环后将矩阵转换为数据帧,但我没有让它工作 - 我无法找出正确的代码for 循环将结果放入矩阵中。我在这里不包括失败的代码,我想我需要开始一个新的。这是我的代码

a <- 2019
z <- 2023

#print each year 12 times
  for(i in a:z){
    print(i);print(i);print(i);print(i);print(i);print(i);
    print(i);print(i);print(i);print(i);print(i);print(i)
  }

#print the sequence 1:12 the number of times that there are years
for(i in a:z) {
  for(i in 1:12) {
    print(i)}}

我的目标是每年打印 12 次的一列,每个月打印第二列,如下所示一年:

example <- data.frame(yr=c(2019,2019,2019,2019,2019,2019,2019,2019,2019,2019,2019,2019),m=c(1,2,3,4,5,6,7,8,9,10,11,12))

谢谢你们!

标签: rfor-loop

解决方案


您可以使用expand.grid

data <- expand.grid(yr = 2019:2023, m = 1:12)

#     yr  m
#1  2019  1
#2  2020  1
#3  2021  1
#4  2022  1
#5  2023  1
#6  2019  2
#7  2020  2
#8  2021  2
#9  2022  2
#10 2023  2
#....

tidyr也有一些选择:

tidyr::expand_grid(yr = 2019:2023, m = 1:12)

tidyr::crossing(yr = 2019:2023, m = 1:12)

在循环中增长数据帧效率非常低,因此for不建议使用循环,但如果我们想出于学习目的这样做,我们可以这样做:

x <- 2019:2023
y <- 1:12
df <- data.frame(matrix(0, nrow = length(x) * length(y), ncol = 2, 
                 dimnames = list(NULL, c('yr', 'm'))))
count <- 1
for(i in x){
   for(j in y) {
     df[count, ] <- c(i, j)
     count <- count + 1
   }
}

推荐阅读