【问题标题】:Print from a for loop into a new data frame从 for 循环打印到新数据帧
【发布时间】:2020-04-20 02:07:03
【问题描述】:

我正在尝试使用 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 次,第二栏每个月打印 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))

谢谢大家!

【问题讨论】:

    标签: r for-loop


    【解决方案1】:

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

    【讨论】:

    • 啊哈,这很好用!您是否知道如何使用 for 循环打印数据?我知道有时不建议从 for 循环创建数据框,但我很想知道如何。我在很多地方都查过,但没有一个代码可以工作。
    • @sebzee 使用for 循环会很慢,并不推荐。如果您有兴趣,我已经更新了答案。
    【解决方案2】:

    我们可以从data.table使用CJ

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

    【讨论】:

      猜你喜欢
      • 2018-07-02
      • 1970-01-01
      • 2015-11-01
      • 2017-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-10
      • 1970-01-01
      相关资源
      最近更新 更多