AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / coding / Perguntas / 77746012
Accepted
Shan Cheung
Shan Cheung
Asked: 2024-01-02 20:12:39 +0800 CST2024-01-02 20:12:39 +0800 CST 2024-01-02 20:12:39 +0800 CST

Agrupar e contar data em R

  • 772

Tenho um conjunto de dados que descreve o número de dias (BedDays) que cada paciente permanece internado em um hospital:

my_df<-data.frame(RecordID=c("1","2","3","4","5","6","7","8","9","10"),
              StartDate=c("2020-03-02","2020-03-05"
                          ,"2020-03-08","2020-03-11"
                          ,"2020-03-14","2020-03-17"
                          ,"2020-03-20","2020-03-23"
                          ,"2020-03-26","2020-03-29"),
              BedDays=c(12,3,2,11,1,10,18,10,3,6))

E gostaria de contar o número de leitos usados ​​a cada dia. Eu gostaria que meus resultados fossem:

Resultados esperados

Até agora, só consigo pensar no uso de arrays e loops. Use o array para listar as datas em que cada paciente ficou no hospital e, em seguida, use o loop para examinar os arrays e contar os pacientes no hospital em um determinado dia. Esta será a contagem de leitos utilizados em um determinado dia. Isso parece complicado.

Existe alguma função/pacote inteligente que possa fazer essa transformação facilmente?

  • 4 4 respostas
  • 57 Views

4 respostas

  • Voted
  1. benson23
    2024-01-02T20:35:23+08:002024-01-02T20:35:23+08:00

    Acho que a chave é "expandir" BedDayspara uma sequência de dias e depois contar esses dias.

    library(tidyverse)
    
    my_df %>% 
      mutate(StartDate = as.Date(StartDate)) %>% 
      reframe(duration = seq(StartDate, StartDate + BedDays - 1, by = 1), .by = RecordID) %>% 
      count(duration)
    
         duration n
    1  2020-03-02 1
    2  2020-03-03 1
    3  2020-03-04 1
    4  2020-03-05 2
    5  2020-03-06 2
    6  2020-03-07 2
    7  2020-03-08 2
    8  2020-03-09 2
    9  2020-03-10 1
    10 2020-03-11 2
    11 2020-03-12 2
    12 2020-03-13 2
    13 2020-03-14 2
    14 2020-03-15 1
    15 2020-03-16 1
    16 2020-03-17 2
    17 2020-03-18 2
    18 2020-03-19 2
    19 2020-03-20 3
    20 2020-03-21 3
    21 2020-03-22 2
    22 2020-03-23 3
    23 2020-03-24 3
    24 2020-03-25 3
    25 2020-03-26 4
    26 2020-03-27 3
    27 2020-03-28 3
    28 2020-03-29 3
    29 2020-03-30 3
    30 2020-03-31 3
    31 2020-04-01 3
    32 2020-04-02 2
    33 2020-04-03 2
    34 2020-04-04 1
    35 2020-04-05 1
    36 2020-04-06 1
    
    • 4
  2. Rui Barradas
    2024-01-02T20:29:53+08:002024-01-02T20:29:53+08:00

    O código abaixo começa dividindo os dados por data, depois cria data.frames com tantas linhas quanto BedDays, reúne todos os dados temporários e agrega os dados para ter contagens de leitos por data.

    my_df<-data.frame(RecordID=c("1","2","3","4","5","6","7","8","9","10"),
                      StartDate=c("2020-03-02","2020-03-05"
                                  ,"2020-03-08","2020-03-11"
                                  ,"2020-03-14","2020-03-17"
                                  ,"2020-03-20","2020-03-23"
                                  ,"2020-03-26","2020-03-29"),
                      BedDays=c(12,3,2,11,1,10,18,10,3,6))
    
    my_df$StartDate <- as.Date(my_df$StartDate)
    
    my_df |>
      split(my_df$StartDate) |>
      lapply(\(x) {
        StartDate <- x$StartDate + seq.int(x$BedDays) - 1L
        data.frame(StartDate, NumBeds = 1L)
      }) |> 
      do.call(rbind, args = _) |>
      aggregate(NumBeds ~ StartDate, data = _, sum)
    #>     StartDate NumBeds
    #> 1  2020-03-02       1
    #> 2  2020-03-03       1
    #> 3  2020-03-04       1
    #> 4  2020-03-05       2
    #> 5  2020-03-06       2
    #> 6  2020-03-07       2
    #> 7  2020-03-08       2
    #> 8  2020-03-09       2
    #> 9  2020-03-10       1
    #> 10 2020-03-11       2
    #> 11 2020-03-12       2
    #> 12 2020-03-13       2
    #> 13 2020-03-14       2
    #> 14 2020-03-15       1
    #> 15 2020-03-16       1
    #> 16 2020-03-17       2
    #> 17 2020-03-18       2
    #> 18 2020-03-19       2
    #> 19 2020-03-20       3
    #> 20 2020-03-21       3
    #> 21 2020-03-22       2
    #> 22 2020-03-23       3
    #> 23 2020-03-24       3
    #> 24 2020-03-25       3
    #> 25 2020-03-26       4
    #> 26 2020-03-27       3
    #> 27 2020-03-28       3
    #> 28 2020-03-29       3
    #> 29 2020-03-30       3
    #> 30 2020-03-31       3
    #> 31 2020-04-01       3
    #> 32 2020-04-02       2
    #> 33 2020-04-03       2
    #> 34 2020-04-04       1
    #> 35 2020-04-05       1
    #> 36 2020-04-06       1
    

    Criado em 02/01/2024 com reprex v2.0.2

    • 3
  3. ThomasIsCoding
    2024-01-02T21:36:15+08:002024-01-02T21:36:15+08:00

    Uma data.tableopção

    > library(data.table)
    
    > setDT(my_df)[, .(Date = as.IDate(StartDate) + seq(BedDays)-1), RecordID][, .N, Date]
              Date N
     1: 2020-03-02 1
     2: 2020-03-03 1
     3: 2020-03-04 1
     4: 2020-03-05 2
     5: 2020-03-06 2
     6: 2020-03-07 2
     7: 2020-03-08 2
     8: 2020-03-09 2
     9: 2020-03-10 1
    10: 2020-03-11 2
    11: 2020-03-12 2
    12: 2020-03-13 2
    13: 2020-03-14 2
    14: 2020-03-15 1
    15: 2020-03-16 1
    16: 2020-03-17 2
    17: 2020-03-18 2
    18: 2020-03-19 2
    19: 2020-03-20 3
    20: 2020-03-21 3
    21: 2020-03-22 2
    22: 2020-03-23 3
    23: 2020-03-24 3
    24: 2020-03-25 3
    25: 2020-03-26 4
    26: 2020-03-27 3
    27: 2020-03-28 3
    28: 2020-03-29 3
    29: 2020-03-30 3
    30: 2020-03-31 3
    31: 2020-04-01 3
    32: 2020-04-02 2
    33: 2020-04-03 2
    34: 2020-04-04 1
    35: 2020-04-05 1
    36: 2020-04-06 1
              Date N
    
    • 3
  4. Best Answer
    2024-01-02T20:57:36+08:002024-01-02T20:57:36+08:00

    Aqui está uma combinação com uncounte count:

    library(dplyr)
    library(tidyr)
    
    my_df %>% 
      uncount(BedDays) %>% 
      mutate(StartDate = StartDate + (row_number() - 1), .by = RecordID) %>% 
      count(StartDate)
    

    saída:

    
        StartDate n
    1  2020-03-02 1
    2  2020-03-03 1
    3  2020-03-04 1
    4  2020-03-05 2
    5  2020-03-06 2
    6  2020-03-07 2
    7  2020-03-08 2
    8  2020-03-09 2
    9  2020-03-10 1
    10 2020-03-11 2
    11 2020-03-12 2
    12 2020-03-13 2
    13 2020-03-14 2
    14 2020-03-15 1
    15 2020-03-16 1
    16 2020-03-17 2
    17 2020-03-18 2
    18 2020-03-19 2
    19 2020-03-20 3
    20 2020-03-21 3
    21 2020-03-22 2
    22 2020-03-23 3
    23 2020-03-24 3
    24 2020-03-25 3
    25 2020-03-26 4
    26 2020-03-27 3
    27 2020-03-28 3
    28 2020-03-29 3
    29 2020-03-30 3
    30 2020-03-31 3
    31 2020-04-01 3
    32 2020-04-02 2
    33 2020-04-03 2
    34 2020-04-04 1
    35 2020-04-05 1
    36 2020-04-06 1
    
    • 2

relate perguntas

  • Adicionar número de série para atividade de cópia ao blob

  • A fonte dinâmica do empacotador duplica artefatos

  • Selecione linhas por grupo com 1s consecutivos

  • Lista de chamada de API de gráfico subscritoSkus estados Privilégios insuficientes enquanto os privilégios são concedidos

  • Função para criar DFs separados com base no valor da coluna

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Vue 3: Erro na criação "Identificador esperado, mas encontrado 'import'" [duplicado]

    • 1 respostas
  • Marko Smith

    Por que esse código Java simples e pequeno roda 30x mais rápido em todas as JVMs Graal, mas não em nenhuma JVM Oracle?

    • 1 respostas
  • Marko Smith

    Qual é o propósito de `enum class` com um tipo subjacente especificado, mas sem enumeradores?

    • 1 respostas
  • Marko Smith

    Como faço para corrigir um erro MODULE_NOT_FOUND para um módulo que não importei manualmente?

    • 6 respostas
  • Marko Smith

    `(expression, lvalue) = rvalue` é uma atribuição válida em C ou C++? Por que alguns compiladores aceitam/rejeitam isso?

    • 3 respostas
  • Marko Smith

    Quando devo usar um std::inplace_vector em vez de um std::vector?

    • 3 respostas
  • Marko Smith

    Um programa vazio que não faz nada em C++ precisa de um heap de 204 KB, mas não em C

    • 1 respostas
  • Marko Smith

    PowerBI atualmente quebrado com BigQuery: problema de driver Simba com atualização do Windows

    • 2 respostas
  • Marko Smith

    AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos

    • 1 respostas
  • Marko Smith

    Estou tentando fazer o jogo pacman usando apenas o módulo Turtle Random e Math

    • 1 respostas
  • Martin Hope
    Aleksandr Dubinsky Por que a correspondência de padrões com o switch no InetAddress falha com 'não cobre todos os valores de entrada possíveis'? 2024-12-23 06:56:21 +0800 CST
  • Martin Hope
    Phillip Borge Por que esse código Java simples e pequeno roda 30x mais rápido em todas as JVMs Graal, mas não em nenhuma JVM Oracle? 2024-12-12 20:46:46 +0800 CST
  • Martin Hope
    Oodini Qual é o propósito de `enum class` com um tipo subjacente especificado, mas sem enumeradores? 2024-12-12 06:27:11 +0800 CST
  • Martin Hope
    sleeptightAnsiC `(expression, lvalue) = rvalue` é uma atribuição válida em C ou C++? Por que alguns compiladores aceitam/rejeitam isso? 2024-11-09 07:18:53 +0800 CST
  • Martin Hope
    The Mad Gamer Quando devo usar um std::inplace_vector em vez de um std::vector? 2024-10-29 23:01:00 +0800 CST
  • Martin Hope
    Chad Feller O ponto e vírgula agora é opcional em condicionais bash com [[ .. ]] na versão 5.2? 2024-10-21 05:50:33 +0800 CST
  • Martin Hope
    Wrench Por que um traço duplo (--) faz com que esta cláusula MariaDB seja avaliada como verdadeira? 2024-05-05 13:37:20 +0800 CST
  • Martin Hope
    Waket Zheng Por que `dict(id=1, **{'id': 2})` às vezes gera `KeyError: 'id'` em vez de um TypeError? 2024-05-04 14:19:19 +0800 CST
  • Martin Hope
    user924 AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos 2024-03-20 03:12:31 +0800 CST
  • Martin Hope
    MarkB Por que o GCC gera código que executa condicionalmente uma implementação SIMD? 2024-02-17 06:17:14 +0800 CST

Hot tag

python javascript c++ c# java typescript sql reactjs html

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve