在使用循环并将值存储在列表中时操作 data.frame

问题描述

我有 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,并将它们全部存储在一个列表中。

解决方法

我们可以使用 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')
,

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

很容易做到

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

frontend http-in
    option httplog
    bind *:80
    bind *:443 ssl crt /usr/local/etc/haproxy/haproxy.cfg/certs/
    timeout http-request 60s
    timeout http-keep-alive 4s
    acl https ssl_fc
    http-request set-header         X-Forwarded-Proto http if !https
    http-request set-header         X-Forwarded-Proto https if https

    stats uri /haproxy?examplehaproxystats74581257445
    log-format %{+Q}o\ %{-Q}ci\ -\ -\ [%T]\ %r\ %ST\ %B\ \"\"\ \"\"\ %cp\ %ms\ %ft\ %b\ %s\ \%Tq\ $

    acl sede_acl req.hdr(host) -i -m str sede.example.com.br
    # redirect code 301 prefix https://sede.example.pub if sede_acl
    use_backend sede_acl if sede_acl
  
backend sede_acl
  http-request set-header Host sede.example.pub
  server sede-server sede.example.pub:443 sni sede.example.pub ssl

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

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)

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...