/ / Adicione um número constante de dias apenas a valores específicos de um quadro de dados contendo datas - r, data, dataframe

Adicione um número constante de dias apenas a valores específicos de um quadro de dados contendo datas - r, data e dataframe

Eu tenho um data.frame FYE contendo datas com eu comparo com outro data.frame contendo datas DATES. Dimensões de ambos iguais. Eu então defino uma matriz lógica A <- matrix(FYE < DATES, nrow = nrow(FYE), ncol = ncol(FYE)). Para cada célula em A com TRUE, quero adicionar 365 dias ao valor correspondente em FYE. Eu tentei o seguinte, mas não funcionou:

  A <- matrix(FYE < DATES, nrow = nrow(FYE),
ncol = ncol(FYE))

FYE[A == TRUE] <- FYE + 365

O código de erro é:

Error in date_next_FYE[A == TRUE] + 365 :
non-numeric argument to binary operator

Obrigado pela ajuda!

Respostas:

1 para resposta № 1

Crie alguns dados

dates <- seq(as.Date("2016-01-01"), as.Date("2017-06-05"), by="day")
set.seed(1234)
FYE <- data.frame(d1=sample(dates, 20), d2=sample(dates, 20), d3=sample(dates, 20))
DATES <- data.frame(d1=sample(dates, 20), d2=sample(dates, 20), d3=sample(dates, 20))

Agora, veja o que o subconjunto faz

str(FYE[FYE < DATES])
chr [1:22] "2016-02-29" "2016-11-27" "2016-01-05" "2016-04-29"

Este é um resultado estranho. Parece que o subconjunto FYE[FYE < DATES] retorna uma cadeia de caracteres. Essa extração remove a classe de data, então você deve adicioná-la novamente com as.Date.

assim

FYE[FYE < DATES] <- as.Date(FYE[FYE < DATES]) + 365

funcionará como desejado.

Podemos verificar se foram feitas alterações. Começando com os dados originais acima,

sum(FYE < DATES)
[1] 22

FYE[FYE < DATES] <- as.Date(FYE[FYE < DATES]) + 365

sum(FYE < DATES)
[1] 4

Talvez mais uma vez, para uma boa medida:

FYE[FYE < DATES] <- as.Date(FYE[FYE < DATES]) + 365
sum(FYE < DATES)
[1] 0

0 para resposta № 2
 library(lubridate)

ymd("2016-07-01") + days(365)