从for循环打印到新的数据框中

时间:2020-04-20 02:07:03

标签: r for-loop

我正在尝试使用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))

谢谢大家!

2 个答案:

答案 0 :(得分:3)

您可以使用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
   }
}

答案 1 :(得分:0)

我们可以使用CJ中的data.table

library(data.table)
CJ(yr = 2019:2023, m = 1:12)
相关问题