【问题标题】:Creating dataframe in R with multiple lines of the same hour在 R 中使用同一小时的多行创建数据框
【发布时间】:2021-04-22 10:30:48
【问题描述】:

我正在尝试创建一个包含以下列的数据框:dt、depth、var1

但是我需要一整年的每小时 4 行,因为我需要在某些深度调整 var1:

dt depth var1
2008-01-01 00:00 2 0.01
2008-01-01 00:00 40 0.01
2008-01-01 00:00 45 0.01
2008-01-01 00:00 100 0.01
2008-01-01 01:00 2 0.01
2008-01-01 01:00 40 0.01
2008-01-01 01:00 45 0.01
2008-01-01 01:00 100 0.01
2008-01-01 02:00 2 0.01
2008-01-01 02:00 40 0.01
2008-01-01 02:00 45 0.01
2008-01-01 02:00 100 0.01
2008-01-01 03:00 2 0.01

如何为第一列创建“dt”列表?

谢谢!

【问题讨论】:

    标签: r list dataframe datetime


    【解决方案1】:

    你可以使用expand.grid

    expand.grid(
      dt = seq(as.POSIXct("2008-01-01 00:00:00", 'UTC'), 
               as.POSIXct("2008-01-01 03:00:00", 'UTC'), 'hour'), 
      depth = c(2, 40, 45, 100), 
      var1 = 0.01
    ) -> result
    
    result
    
    #                    dt depth var1
    #1  2008-01-01 00:00:00     2 0.01
    #2  2008-01-01 01:00:00     2 0.01
    #3  2008-01-01 02:00:00     2 0.01
    #4  2008-01-01 03:00:00     2 0.01
    #5  2008-01-01 00:00:00    40 0.01
    #6  2008-01-01 01:00:00    40 0.01
    #7  2008-01-01 02:00:00    40 0.01
    #8  2008-01-01 03:00:00    40 0.01
    #9  2008-01-01 00:00:00    45 0.01
    #10 2008-01-01 01:00:00    45 0.01
    #11 2008-01-01 02:00:00    45 0.01
    #12 2008-01-01 03:00:00    45 0.01
    #13 2008-01-01 00:00:00   100 0.01
    #14 2008-01-01 01:00:00   100 0.01
    #15 2008-01-01 02:00:00   100 0.01
    #16 2008-01-01 03:00:00   100 0.01
    

    如果您想要如图所示的顺序,您可以安排上述结果或使用tidyr::expand_grid

    tidyr::expand_grid(
      dt = seq(as.POSIXct("2008-01-01 00:00:00", 'UTC'), 
               as.POSIXct("2008-01-01 03:00:00", 'UTC'), 'hour'), 
      depth = c(2, 40, 45, 100), 
      var1 = 0.01
    ) -> result
    
    result
    
    # A tibble: 16 x 3
    #   dt                  depth  var1
    #   <dttm>              <dbl> <dbl>
    # 1 2008-01-01 00:00:00     2  0.01
    # 2 2008-01-01 00:00:00    40  0.01
    # 3 2008-01-01 00:00:00    45  0.01
    # 4 2008-01-01 00:00:00   100  0.01
    # 5 2008-01-01 01:00:00     2  0.01
    # 6 2008-01-01 01:00:00    40  0.01
    # 7 2008-01-01 01:00:00    45  0.01
    # 8 2008-01-01 01:00:00   100  0.01
    # 9 2008-01-01 02:00:00     2  0.01
    #10 2008-01-01 02:00:00    40  0.01
    #11 2008-01-01 02:00:00    45  0.01
    #12 2008-01-01 02:00:00   100  0.01
    #13 2008-01-01 03:00:00     2  0.01
    #14 2008-01-01 03:00:00    40  0.01
    #15 2008-01-01 03:00:00    45  0.01
    #16 2008-01-01 03:00:00   100  0.01
    

    【讨论】:

    • 谢谢你罗纳克!
    【解决方案2】:

    试试这个:

    start_date_time <- as.POSIXct("2008-01-01 00:00", format= "%Y-%m-%d %H:%M")
    end_date_time <- as.POSIXct("2008-01-01 03:00", format= "%Y-%m-%d %H:%M")
    
    df <- data.frame(dt = rep(seq(start_date_time, end_date_time, by = 3600), each = 4), 
                     depth = rep(c(2, 40, 45, 100)),
                     var1 = 0.01)
    
    df
    #>                     dt depth var1
    #> 1  2008-01-01 00:00:00     2 0.01
    #> 2  2008-01-01 00:00:00    40 0.01
    #> 3  2008-01-01 00:00:00    45 0.01
    #> 4  2008-01-01 00:00:00   100 0.01
    #> 5  2008-01-01 01:00:00     2 0.01
    #> 6  2008-01-01 01:00:00    40 0.01
    #> 7  2008-01-01 01:00:00    45 0.01
    #> 8  2008-01-01 01:00:00   100 0.01
    #> 9  2008-01-01 02:00:00     2 0.01
    #> 10 2008-01-01 02:00:00    40 0.01
    #> 11 2008-01-01 02:00:00    45 0.01
    #> 12 2008-01-01 02:00:00   100 0.01
    #> 13 2008-01-01 03:00:00     2 0.01
    #> 14 2008-01-01 03:00:00    40 0.01
    #> 15 2008-01-01 03:00:00    45 0.01
    #> 16 2008-01-01 03:00:00   100 0.01
    

    reprex package (v2.0.0) 于 2021-04-22 创建

    【讨论】:

    • 太好了,只有一件事,如果您可以使用 dput(your_data) 或作为数据框对象(如答案)将数据粘贴到问题中,这将使您的问题可重现且更易于测试。您的问题基于相对简单的数据集,但未来的问题可能不会。有关方便的提示,请参阅 minimal reproducible example
    • 谢谢。这个论坛还是新手,但下次我会试试的。
    猜你喜欢
    • 1970-01-01
    • 2019-08-23
    • 1970-01-01
    • 2020-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多