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 № 1Crie 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)