查看自最小值以来已经过了多长时间

时间:2017-10-02 16:45:51

标签: r dplyr

我有一个带有变量值的数据框(以NAs开头)和该值有效的时间。对于每一行,我想要一个新值来确定当前cummin以及自该最小值以来已经过了多长时间。

我有cummin部分,但请注意'多久'一部分。

例如,这是我的数据框

example <- data.frame(variable = c('a', 'a', 'a', 'a', 'a', 'b', 'b', 'b', 'b', 'b', 'b', 'b', 'b'),
                      time = c(Sys.time(), Sys.time() + 5, Sys.time() + 15, Sys.time() + 34, Sys.time() + 51, Sys.time(), Sys.time() + 10, Sys.time() + 39, Sys.time() + 63, Sys.time() + 79, Sys.time() + 102, Sys.time() + 110, Sys.time() + 115),
                      value = c(NA, 3, 6, 2, 8, NA, NA, 1, 4, 3, 2, 0, 3))

我目前正在使用它来获取变量

cummin
cum_na.rm <- function(x, func){
    x[!is.na(x)] <- func(x[!is.na(x)])
    x
}
example %>% 
    group_by(variable) %>% 
    mutate(current_min = cum_na.rm(value, cummin))

我想添加一些东西来获取current_min之后的时间以获得以下内容:

   variable                time value current_min time_since_min
 1        a 2017-10-02 17:13:59    NA          NA             NA
 2        a 2017-10-02 17:14:04     3           3         0 secs
 3        a 2017-10-02 17:14:14     6           3        10 secs
 4        a 2017-10-02 17:14:33     2           2         0 secs
 5        a 2017-10-02 17:14:50     8           2        17 secs 
 6        b 2017-10-02 17:13:59    NA          NA             NA
 7        b 2017-10-02 17:14:09    NA          NA             NA
 8        b 2017-10-02 17:14:38     1           1         0 secs
 9        b 2017-10-02 17:15:02     4           1        24 secs
10        b 2017-10-02 17:15:18     3           1        40 secs
11        b 2017-10-02 17:15:41     2           1        63 secs
12        b 2017-10-02 17:15:49     0           0         0 secs
13        b 2017-10-02 17:15:54     3           0         5 secs

实际的数据帧超过1,000,000行,有很多变量,所以任何特别慢的东西都可能有问题!

任何帮助将不胜感激

1 个答案:

答案 0 :(得分:2)

您可以为{_ 1}添加current_min,然后添加group_by

你会得到一些奇怪的NA结果,所以你可以在之后删除它们

time - time[1]