【问题标题】:Create new dataframe with repeated values based on Date Column in R基于R中的日期列创建具有重复值的新数据框
【发布时间】:2021-08-12 09:27:22
【问题描述】:

我有一个非常基本的问题。我有以下带有两列的示例数据框; “日期”和“值”:

df <- structure(list(Date = structure(c(17075, 17083), class = "Date"), Value = c(0.16, 0.17)), row.names = c(NA, 2L), class = "data.frame")

我想创建一个在特定日期前后具有重复值的新数据框。日期不应重复,但应根据重复值所采取的步骤数进行更改。

例如,对于上述数据框,如果我想在日期前后重复 +-3 步,则输出数据框应如下所示:

out <- structure(list(Date = structure(c(17072,17073,17074,17075,17076,17077,17078,17080,17081,17082,17083,17084,17085,17086 , class = "Date"), Value = c(0.16,0.16,0.16,0.16,0.16,0.16,0.16,0.17,0.17,0.17,0.17,0.17,0.17, 0.17)), row.names = c(NA, 14L), class = "data.frame")

我们怎样才能完成这项任务?我尝试使用 rep 功能,但对我不起作用。

【问题讨论】:

    标签: r dataframe dplyr lubridate


    【解决方案1】:

    如果我们有一个 n 作为 3,我们可以使用 rowwise 并在 list 和以后的 unnest list 列中获取“日期”的 sequence

    library(dplyr)
    library(tidyr)
    library(lubridate)
    n <- 3
    df %>% 
      rowwise %>%
      mutate(Date =  list(seq(Date - days(n), length.out = 2 *n +1, 
            by = 'day'))) %>% 
      ungroup %>%
      unnest(c(Date))
    

    -输出

    # A tibble: 14 x 2
    #   Date       Value
    #   <date>     <dbl>
    # 1 2016-09-28  0.16
    # 2 2016-09-29  0.16
    # 3 2016-09-30  0.16
    # 4 2016-10-01  0.16
    # 5 2016-10-02  0.16
    # 6 2016-10-03  0.16
    # 7 2016-10-04  0.16
    # 8 2016-10-06  0.17
    # 9 2016-10-07  0.17
    #10 2016-10-08  0.17
    #11 2016-10-09  0.17
    #12 2016-10-10  0.17
    #13 2016-10-11  0.17
    #14 2016-10-12  0.17
    

    map 可能会更快一些

    library(purrr)
    df %>%
      mutate(Date = map(Date, ~ seq(.x - days(n), 
                length.out = 2 * n + 1, by = 'day'))) %>% 
      unnest(Date)
    

    【讨论】:

      【解决方案2】:

      凌乱的基地R:

      n <- 3
      unique_dates <- unique(df$Date)
      within(
        merge(
          df, 
          do.call(
            rbind,
            lapply(
              split.default(unique_dates, seq_len(length(unique_dates))),
              function(x){
                y <- as.Date(x)
                z <- sort(c(y - seq_len(n), y, y + seq_len(n)))
                data.frame(Date = y, Dates = z)
              }
            )
          ),
          by = "Date", 
          all = TRUE
        ),
        {
          Date <- Dates
          rm(Dates)
        }
      )
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-16
        • 1970-01-01
        • 2012-02-02
        • 1970-01-01
        • 1970-01-01
        • 2011-10-19
        相关资源
        最近更新 更多