2017-10-02 3 views
2

データフレームに変数、値(NAsで始まる)、およびその値が有効な時間があります。各行について、私は現在の値であるcumminを決定する新しい値と、その最小値からの経過時間を求めます。最小値からどれぐらいの時間が来たかを調べる

私は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)) 

によって値の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)) 

です次の行に沿って何かを得るために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行を超えているため、特に遅いものは問題になることがあります。

すべてのヘルプはあなたがtime - time[1]に追加し、current_minためgroup_byに追加することができます

答えて

2

をいただければ幸いです。

あなたはNAのためにいくつかの奇妙な結果が得られますので、あなたは

example %>% 
    group_by(variable) %>% 
    mutate(current_min = cum_na.rm(value, cummin)) %>% 
    group_by(current_min) %>% 
    mutate(time_since_min = time - time[1]) 
その後、それらを削除することができます
関連する問題