/ / Sottoinsiemi di una matrice contenente solo date - r, data, sottoinsieme

Sottoinsiemi di una matrice contenente solo date - r, data, sottoinsieme

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 lubridatepacchetto 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 № 1

Meglio 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.