Je suis novice en R et j'ai une question simple.
J'ai un dataframe où j'ai une colonne sur l'horodatage et diverses autres fonctionnalités. La colonne d'horodatage est de 31 jours et je dois obtenir les n derniers jours (disons 16) de l'horodatage.
En supposant 31 jours, il me donnera ensuite les observations des 16 derniers jours (du 16 octobre au 31 octobre). Je sais comment faire cela en Python mais je ne sais pas comment faire cela dans R.
Exemple df:
f1 f2 f3 timestamp
1 2 3 2020-10-02 14:36:03
2 3 5 2020-10-03 14:26:03
1 2 3 2020-10-05 14:36:03
2 3 5 2020-10-05 14:26:03
1 2 3 2020-10-07 14:36:03
2 3 5 2020-10-10 14:26:03
1 2 3 2020-10-12 14:36:03
2 3 5 2020-10-13 14:26:03
1 2 3 2020-10-15 14:36:03
2 3 5 2020-10-16 14:26:03
1 2 3 2020-10-22 14:36:03
2 3 5 2020-10-25 14:26:03
1 2 3 2020-10-26 14:36:03
2 3 5 2020-10-31 14:26:03
À quoi devrait ressembler le résultat:
f1 f2 f3 timestamp
2 3 5 2020-10-16 14:26:03
1 2 3 2020-10-22 14:36:03
2 3 5 2020-10-25 14:26:03
1 2 3 2020-10-26 14:36:03
2 3 5 2020-10-31 14:26:03
L'heure de l'horodatage est différente pour chaque observation et l'image ci-dessus est juste à des fins d'illustration. Toute aide serait appréciée.
Mettre à jour pour supprimer toute confusion:
Je ne peux pas utiliser la fonction tail () comme dans le dataframe d'origine, il y a plusieurs valeurs par jour. Toutes mes excuses pour ne pas avoir été clair.
2 réponses
Peut-être avez-vous besoin de lubridate
dans subset
library(lubridate)
subset(
df,
day(timestamp) >= days_in_month(timestamp) - 15
)
Ou d'une manière dplyr
df %>%
filter(between(day(timestamp), days_in_month(timestamp) - 15, days_in_month(timestamp)))
Qui donne
f1 f2 f3 timestamp
10 2 3 5 2020-10-16 14:26:03
11 1 2 3 2020-10-22 14:36:03
12 2 3 5 2020-10-25 14:26:03
13 1 2 3 2020-10-26 14:36:03
14 2 3 5 2020-10-31 14:26:03
Données
> dput(df)
structure(list(f1 = c(1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L,
1L, 2L, 1L, 2L), f2 = c(2L, 3L, 2L, 3L, 2L, 3L, 2L, 3L, 2L, 3L,
2L, 3L, 2L, 3L), f3 = c(3L, 5L, 3L, 5L, 3L, 5L, 3L, 5L, 3L, 5L,
3L, 5L, 3L, 5L), timestamp = structure(c(1601642163, 1601727963,
1601901363, 1601900763, 1602074163, 1602332763, 1602506163, 1602591963,
1602765363, 1602851163, 1603370163, 1603632363, 1603719363, 1604150763
), class = c("POSIXct", "POSIXt"), tzone = "")), row.names = c(NA,
-14L), class = "data.frame")
Si vous devez d'abord commander votre dataframe puis utiliser order, ensuite vous pouvez simplement utiliser unique
avec tail
pour obtenir les dates et ensuite simplement filtrer votre dataframe. Je suppose qu'avec horodatage vous voulez dire POSIXct
classe dans R, puis essayez
data <- data.frame(
f1 = c(1,2,1,2,1,2),
timestamp = as.POSIXct(c(
"2020-10-02 14:36:03",
"2020-10-03 14:26:03",
"2020-10-05 14:36:04",
"2020-10-05 14:36:04",
"2020-10-05 14:36:04",
"2020-10-05 14:36:05"
))
)
data_ordered <- data[order(as.Date(data$timestamp)),]
dates <- tail(unique(data_ordered$timestamp), 2)
data_ordered[data_ordered$timestamp %in% dates, ]
Sans commander, vous pouvez bien sûr appeler directement tail()
sur votre dataframe.
Alternative:
La version ci-dessus est de base R, vous pouvez également résoudre votre problème un peu plus facilement en utilisant tidyverse
ou data.table
Alternative 1: tidyverse
library(dplyr)
library(tibble)
data <- as_tibble(data)
data %>% filter(timestamp %in% dates)
Alternative 2: table de données
library(data.table)
data <- as.data.table(data)
data[timestamp %in% dates]
Questions connexes
De nouvelles questions
r
R est un langage de programmation et un environnement logiciel libres et open source pour le calcul statistique, la bioinformatique, la visualisation et le calcul général. Veuillez fournir des exemples minimaux et reproductibles ainsi que le résultat souhaité. Utilisez dput () pour les données et spécifiez tous les packages non basiques avec des appels à library (). N'incorporez pas d'images pour les données ou le code, utilisez plutôt des blocs de code en retrait. Pour les questions relatives aux statistiques, utilisez https://stats.stackexchange.com.