【问题标题】:Manipulating data.frame while using cycles and storing values in a list在使用循环并将值存储在列表中时操作 data.frame
【发布时间】:2021-10-07 07:56:36
【问题描述】:

我有 2 个代码可以操纵和过滤(按日期)我的 data.frame,并且运行良好。现在我不仅要运行代码一天,还要在向量中运行每一天:

seq(from=as.Date('2020-03-02'), to=Sys.Date(),by='days')` #.... 538 days

我想在 2020-03-02 和今天之间的所有日子里运行的代码是:

  KOKOKO <- data.frame %>%
          filter(DATE < '2020-03-02')%>%
          summarize(DATE = '2020-03-02', CZK = sum(Objem.v.CZK,na.rm = T) 
        
  STAVPTF <- data.frame %>% 
          filter (DATE < '2020-03-02')%>%
          group_by(CP) %>% 
          summarize(mnozstvi = last(AKTUALNI_MNOZSTVI_AKCIE), DATE = '2020-03-02') %>%
          select(DATE,CP,mnozstvi)  %>%      
          rbind(KOKOKO)%>%
          drop_na() %>%

因此,我不想填写“2020-03-02”,而是一个接一个地填写“2020-03-02”以来的所有日子。为这样的独特日子创建的每一个 KOKOKO 和 STAVPTF 我都想保存为单独的 data.frame,并将它们全部存储在一个列表中。

【问题讨论】:

    标签: r list dataframe dplyr cycle


    【解决方案1】:

    我们可以使用map 来循环序列并应用代码

    library(dplyr)
    library(purrr)
    out <- map(s1, ~   data.frame %>%
              filter(DATE < .x)%>%
              summarize(DATE = .x, CZK = sum(Objem.v.CZK,na.rm = TRUE))
    

    由于这是重复循环,所以一个函数会使其更干净

    f1 <- function(dat, date_col, group_col, Objem_col, aktualni_col, date_val) {
         filtered <- dat %>%
              filter({{date_col}} < date_val)
         KOKOKO <-  filtered %>%
              summarize({{date_col}} := date_val,
              CZK = sum({{Objem_col}}, na.rm = TRUE) 
            
        STAVPTF <- filtered %>%        
              group_by({{group_col}}) %>% 
              summarize(mnozstvi = last({{aktualni_col}}),
                {{date_col}} := date_val) %>%
              select({{date_col}}, {{group_col}}, mnozstvi)  %>%      
              bind_rows(KOKOKO)%>%
              drop_na()
        return(STAVPTF)
    }
    

    并调用为

    map(s1, ~ f1(data.frame, DATE, CP, Objem.v.CZK, AKTUALNI_MNOZSTVI_AKCIE, !!.x))
    

    在哪里

    s1 <- seq(from=as.Date('2020-03-02'), to=Sys.Date(), by='days')
    

    【讨论】:

      【解决方案2】:

      如果您提供一个最小的可重现示例,那么回答您的问题会更容易。使用 tidyverses 很容易做到reprex packages

      但是,您的 KOKOKO 代码可以重写为简单的累积和:

      KOKOKO = 
        data.frame %>% 
        arrange(DATE) %>%    # if necessary 
        group_by(DATE) %>% 
        summarise(CZK = sum(Objem.v.CZK), .groups = 'drop') %>% # summarise per DATE (if necessary)
        mutate(CZK = cumsum(CZK) - CZK)  # cumulative sum excluding current row (current DATE)
      

      甚至 STAVPTF 代码也可能无需迭代即可重写。首先找到每个 CP 和 DATE 的最后一个 AKTUALNI_MNOZSTVI_AKCIE 值。然后将此值分配给下一个 DATE:

      STAVPTF <-
        data.frame %>% 
        group_by(CP, DATE) %>% 
        summarise(mnozstvi = last(AKTUALNI_MNOZSTVI_AKCIE), .groups='drop_last') %>%
        arrange(DATE) %>%    # if necessary 
        mutate(DATE = lead(DATE))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-06
        • 1970-01-01
        • 2018-12-08
        • 1970-01-01
        • 2021-11-04
        • 2017-09-08
        相关资源
        最近更新 更多