2017-11-06 10 views
3

データフレームに変数、値(NAsで始まる)、およびその値が有効な時間があります。私は、あなたは値がデータフレーム内ですばやく移動したかどうかを確認

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() + 151, Sys.time(), Sys.time() + 1, Sys.time() + 5, Sys.time() + 77, Sys.time() + 79, Sys.time() + 102, Sys.time() + 110, Sys.time() + 145), 
         value = c(NA, 3, 6, 2, 8, NA, 15, 11, 8, 6, 4, 0, 3)) 

に 「早く」移動は、例えば、過去分

以上5ずつ増加/減少として定義され、ここに私のデータフレームがある

、値が急速に最近変更されたかどうかを判断したいです

:コード

library(ggplot2) 
ggplot(example, aes(x = time, y = value, by = variable)) + geom_step() 

私は値が過去分に5つ以上で移動しているかどうかを示すboolean型の列を追加したいので、次で終わるだろうを使用してデータを視覚化することができます

variable    time value fast_move 
1   a 2017-11-06 15:59:10 NA  FALSE 
2   a 2017-11-06 15:59:15  3  FALSE 
3   a 2017-11-06 15:59:25  6  FALSE 
4   a 2017-11-06 15:59:44  2  FALSE 
5   a 2017-11-06 16:01:41  8  TRUE 
6   b 2017-11-06 15:59:10 NA  FALSE 
7   b 2017-11-06 15:59:11 15  FALSE 
8   b 2017-11-06 15:59:15 11  FALSE 
9   b 2017-11-06 16:00:27  8  FALSE 
10  b 2017-11-06 16:00:29  6  FALSE 
11  b 2017-11-06 16:00:52  4  TRUE 
12  b 2017-11-06 16:01:00  0  TRUE 
13  b 2017-11-06 16:01:35  3  FALSE 

行5は、1回で2から8(6の変化)になったので、TRUEです。それは8に15から移動してきたが、それは行11

60秒かけてこれをしなかったので

行9はFALSEあり、それは26秒で11から4に行っているためTRUEである(16で11でした。 00:26と4:16:52:00)。同様に行12はTRUE

です。実際のデータフレームは、多くの変数を持つ1,000,000行を超えていますので、特に遅いものは問題になることがあります。

すべてのヘルプは、私がこれまで行っているかについて、ユーザーのコメントに答えるために

EDIT

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

  • は、私は現在値は60だったものを発見しました秒前に、そして差を計算しました。これが> 5の場合、fast_moveをTRUEに設定します。この

    isFastMove <- function(data){ 
    
    library(data.table) 
    
    data <- data %>% 
        unique() %>% 
        data.table 
    
    prevData <- mutate(data, time = time - 60) %>% 
        select(-value) %>% 
        data.table 
    
    setkeyv(data, c('variable', 'time')) 
    setkeyv(prevData, c('variable', 'time')) 
    
    prevData <- data[prevData, roll = T, rollends = T] %>% 
        mutate(time = time + 60) %>% 
        rename(previous_value = value) 
    
    data <- merge(data, prevData, by = c('variable', 'time')) %>%  
        mutate(fast_move = !is.na(previous_value) & abs(value - previous_value) > 5) 
    
    return(data) 
    } 
    

を行うには、次のコードを使用した値が3であった場合は、これは常に、その後、例えば、動作しない1に低下し、すぐに7に増加これは速い動きになりますが、私が30秒前と比較すると3となり、速い動きとして分類されませんでした。

+0

を? – useR

+0

現時点では、私は60秒前の値を見つけ、差異を計算しました。これが> 5の場合、fast_moveをTRUEに設定します。しかし、これは必ずしも有効ではありません。たとえば、値が3の場合、1に落ちて直ちに7に増加します。これは速い動きですが、30秒前と比較すると3となり、速い動きとして分類されません – user1165199

+0

これまでに試したコードを投稿して、それがあなたに期待しない理由を説明できますか?あなたの質問に出力?これをコメントとして投稿しない – useR

答えて

1

一つの変数のために、このRcpp機能を使用すると、高速である必要があります:

#include <Rcpp.h> 
using namespace Rcpp; 

// [[Rcpp::export]] 
LogicalVector fastMove(const NumericVector& time, 
         const NumericVector& value, 
         double nsec = 60, 
         double nval = 5) { 

    int n = time.size(); 
    LogicalVector fast_move(n); 

    int i, j; 
    double tmin, vmin, vmax; 

    for (i = n - 1; i > 0; i--) { 
    tmin = time[i] - nsec; 
    vmin = value[i] - nval; 
    vmax = value[i] + nval; 
    for (j = i - 1; j > 0; j--) { 
     if (time[j + 1] - 1 < tmin) break; 
     if (value[j] < vmin || value[j] > vmax) { 
     fast_move[i] = true; 
     break; 
     } 
    } 
    } 

    return fast_move; 
} 

dplyr使用し、各変数にこの機能を適用するには:あなたがこれまでに試してみました何

library(dplyr) 
example %>% 
    group_by(variable) %>% 
    mutate(fast_move = fastMove(time, value)) 
+0

ありがとうございます。この値はその特定の時刻にのみ有効であると仮定しますが、実際には値は次の変更まで有効です。行5を例として使用します 行4に15:59:44の値2、行5に16:01:41の値8があります。上記はこれらの時間を比較し、変更には117秒かかったと仮定しています。実際には、実際には15:59:44から16:01:40までは2という値だったので、6の増加が実際に起こったので、速い移動として分類する必要があります。 – user1165199

+0

jのforループの最初の行を 'if(time [j + 1] - 1 user1165199