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.

1
Syed Ahmed 9 déc. 2020 à 16:05

2 réponses

Meilleure réponse

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")
2
ThomasIsCoding 9 déc. 2020 à 13:52

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]
0
Thomas 9 déc. 2020 à 13:50
65217379