Ho ottenuto una matrice m che assomiglia a questo:
df <- c("2011-01-02", "2011-01-05", "2011-01-08", "2011-01-11", "2011-01-14",
"2011-01-17", "2011-01-20", "2011-01-23", "2011-01-26", "2011-01-29",
"2011-02-01", "2011-02-04", "2011-02-07", "2011-02-10", "2011-02-13")
m <- matrix(nrow = 1, ncol = 15, byrow = T, data = df)
Le voci all'interno della matrice sono Date
oggetti di classe.
Ho un intervallo con:
start <- as.Date("2011-01-26")
end <- as.Date("2011-02-10")
Ora voglio selezionare tutte le date nella matrice mche cadono in questo intervallo (ad esempio cols 9-14) e li producono in una nuova matrice. Non ero in grado di eseguire questa selezione, qualsiasi input è molto apprezzato! Io uso il lubridate
pacchetto in R.
La formattazione della matrice m riflette una parte della prima riga della mia matrice di date originale, che a sua volta ha dim = (96, 850)
.
EDIT1: modificato per chiarezza, erano "inizio" e "fine" Date
tipi ma non etichettati come tali.
risposte:
3 per risposta № 1Meglio trattare le tue date come Date
classe
# convert to Dates
m <- as.Date(m)
start <- as.Date(start)
end <- as.Date(end)
Uso dplyr::between
per filtrare i tuoi dati
require(dplyr)
ans <- m[dplyr::between(m, start, end)] # m >= start && m <= end
# [1] "2011-01-26" "2011-01-29" "2011-02-01" "2011-02-04" "2011-02-07"
# [6] "2011-02-10"
Questo produce un vettore.
Per un'uscita matrix, prova qualcosa di simile
n <- m
n[!dplyr::between(n, start, end)] <- NA
newm <- matrix(nrow=1, ncol=15, byrow=T, data=n)
1 per risposta № 2
Ecco un metodo di base R che utilizza seq
per generare le date tra inizio e fine e %in%
m[m %in% as.character(seq(as.Date(start), as.Date(end), by="day"))]
[1] "2011-01-26" "2011-01-29" "2011-02-01" "2011-02-04" "2011-02-07" "2011-02-10"
Una cosa da notare è che Date è una classe in R, così come la matrice. È abbastanza difficile, (probabilmente non impossibile) memorizzare le date in una matrice come oggetti Date. Invece, i precedenti sono memorizzati come caratteri.
Questa soluzione converte inizio e fine in date utilizzando as.Date
e poi usa seq
per produrre un vettore di date giornaliere dall'inizio alla fine. Questi vengono poi convertiti in caratteri e usati per confrontare l'elemento in m usando %in%
. Finalmente, [
è usato per estrarre gli elementi desiderati.