Mes données sont organisées comme ci-dessous:

Data <- data.frame(Seconds = c(4, 33, 46, 64, 78, 94, 100, 123, 150, 166, 183),
                   Margin = c(0, -1, 0, 1, 1, 2, 2, 3, 3, 4, 4))

Je souhaite obtenir le Margin à 1, 2 et 3 minutes. Ma sortie anticipée ressemblerait donc à:

MinuteData <- data.frame(Minutes = c(1, 2, 3),
                         Margin = c(0, 2, 4))

Comment pourrais-je procéder?

r
0
user2716568 8 oct. 2020 à 04:26

2 réponses

Meilleure réponse

Vous pouvez utiliser cut / findInterval pour diviser les données en secondes en minutes et sélectionner la dernière valeur de chaque minute.

library(dplyr)

Data %>%
  group_by(Minutes = findInterval(Seconds, seq(0, max(Seconds), 60))) %>%
  summarise(Margin = last(Margin))

#   Minutes Margin
#    <int>  <dbl>
#1       1      0
#2       2      2
#3       3      4
#4       4      4

Cela considère la dernière valeur comme une nouvelle minute, vous pouvez supprimer la dernière ligne si vous ne voulez considérer que les minutes complètes.


Cela peut également être écrit en base R:

with(Data, tapply(Margin, findInterval(Seconds, seq(0, max(Seconds), 60)), 
           function(x) x[length(x)]))
2
Ronak Shah 8 oct. 2020 à 01:44

Une autre solution

df %>% 
  mutate(Minutes = trunc(Seconds / 60) + 1) %>% 
  group_by(Minutes) %>% 
  slice_tail(n = 1)

  Seconds Margin Minutes
    <dbl>  <dbl>   <dbl>
1      46      0       1
2     100      2       2
3     166      4       3
4     183      4       4
0
Yuriy Saraykin 8 oct. 2020 à 09:55