junção bases de dados ids repetidos

-1

Tenho duas bases de dados, uma base de cirurgias, com o prontuário do paciente e a data de realização da cirurgia e uma base de movimentações. Movimentações tem uma coluna de prontuário e data de internação do paciente, e data da alta, preciso juntar essas bases, mas como um mesmo prontuário pode ter mais de um valor nas duas bases, não tenho nenhum identificador único, então a estratégia é a seguinte, Tenho que pegar a data de realização da cirurgia na base de cirurgia e com essa data verificar, se essa data está no intervalo da base de movimentações, que é entre data da alta - data de internação do paciente, se a data da cirurgia estiver nesse intervalo, preciso contabilizar o valor da qtde de cirurgias no data frame movimentações(cada linha em cirurgias é uma cirurgia realizada naquela data, alguém pode me ajudar como fazer isso em R? a base de dados tem 400 mil registros. aqui está um exemplo simplificado para um paciente.
dados <- c( 50000, "2016-09-29 13:39:00", "2016-09-30 16:00:00", 50000, "2016-10-06 14:50:00", "2016-10-08 09:00:00", 50000, "2017-08-02 16:27:00", "2017-08-03 11:30:00", 50000, "2017-08-08 08:52:00", "2017-08-09 20:10:00", 50000, "2017-09-05 14:17:00", "2017-09-11 08:20:00", 50000, "2018-05-21 17:46:00", "2018-05-24 17:50:00" )

matriz <- matrix(dados, ncol = 3, byrow = TRUE)

movimentacoes <- as.data.frame(matriz)

colnames(movimentacoes) <- c("Prontuario", "DataInternacao", "HoraAlta")

movimentacoes$Prontuario <- as.integer(movimentacoes$Prontuario) movimentacoes$DataInternacao <- as.POSIXct(movimentacoes$DataInternacao) movimentacoes$HoraAlta <- as.POSIXct(movimentacoes$HoraAlta)

cirurgias = data.frame( prontuario = rep(50000,3), data_realiza = as.Date(c('2017-09-07','2016-09-29','2017-09-11')))

Sorry, I don't speak Portuguese.
Does this help?

dados <- c( 50000, "2016-09-29 13:39:00", "2016-09-30 16:00:00", 50000, "2016-10-06 14:50:00", "2016-10-08 09:00:00", 50000, "2017-08-02 16:27:00", "2017-08-03 11:30:00", 50000, "2017-08-08 08:52:00", "2017-08-09 20:10:00", 50000, "2017-09-05 14:17:00", "2017-09-11 08:20:00", 50000, "2018-05-21 17:46:00", "2018-05-24 17:50:00" )

matriz <- matrix(dados, ncol = 3, byrow = TRUE)

movimentacoes <- as.data.frame(matriz)

colnames(movimentacoes) <- c("Prontuario", "DataInternacao", "HoraAlta")

movimentacoes$Prontuario <- as.integer(movimentacoes$Prontuario) 
movimentacoes$DataInternacao <- as.POSIXct(movimentacoes$DataInternacao) 
movimentacoes$HoraAlta <- as.POSIXct(movimentacoes$HoraAlta)

cirurgias = data.frame( prontuario = rep(50000,3), 
                        data_realiza = as.Date(c('2017-09-07','2016-09-29','2017-09-11')))
library(dplyr)

NewDF <- full_join(cirurgias, movimentacoes, 
                    by = join_by("prontuario" == "Prontuario", between("data_realiza", DataInternacao, HoraAlta)))
NewDF
#>   prontuario data_realiza      DataInternacao            HoraAlta
#> 1      50000   2017-09-07 2017-09-05 14:17:00 2017-09-11 08:20:00
#> 2      50000   2016-09-29                <NA>                <NA>
#> 3      50000   2017-09-11 2017-09-05 14:17:00 2017-09-11 08:20:00
#> 4      50000         <NA> 2016-09-29 13:39:00 2016-09-30 16:00:00
#> 5      50000         <NA> 2016-10-06 14:50:00 2016-10-08 09:00:00
#> 6      50000         <NA> 2017-08-02 16:27:00 2017-08-03 11:30:00
#> 7      50000         <NA> 2017-08-08 08:52:00 2017-08-09 20:10:00
#> 8      50000         <NA> 2018-05-21 17:46:00 2018-05-24 17:50:00
movimentacoes$DataInternacao <- as.Date(movimentacoes$DataInternacao)

NewDF2 <- full_join(cirurgias, movimentacoes, 
                    by = join_by("prontuario" == "Prontuario", between("data_realiza", DataInternacao, HoraAlta)))
NewDF2
#>   prontuario data_realiza DataInternacao            HoraAlta
#> 1      50000   2017-09-07     2017-09-05 2017-09-11 08:20:00
#> 2      50000   2016-09-29     2016-09-29 2016-09-30 16:00:00
#> 3      50000   2017-09-11     2017-09-05 2017-09-11 08:20:00
#> 4      50000         <NA>     2016-10-06 2016-10-08 09:00:00
#> 5      50000         <NA>     2017-08-02 2017-08-03 11:30:00
#> 6      50000         <NA>     2017-08-08 2017-08-09 20:10:00
#> 7      50000         <NA>     2018-05-21 2018-05-24 17:50:00

Created on 2023-09-01 with reprex v2.0.2

In NewDF, data_realiza = 2016-09-29 does not match any row in movimentacoes because data_realiza is a Date and is equal to 2016-09-29 00:00:00. To make NewDF2, I changed movimentacoes$DataInternacao from POSIXct to a Date so the 2016-09-29 of data_realiza would match.

This topic was automatically closed 21 days after the last reply. New replies are no longer allowed.

If you have a query related to it or one of the replies, start a new topic and refer back with a link.