2016-07-07 8 views
2

私はデータセットにギャップがある不規則な時系列を持っています。さらに、データがグループ化される。ラグ関数は観測によって遅れを見つけることができました(データセット内の先行レコードが見つかるように)ので、時間変数を指定し、遅れ時間を計算して遅れを計算します。この質問:R lag/lead irregular time series dataも同様のことをしています。しかし、zooソリューションを使用することはできません(私は何らかのパッケージ非互換性があり、zooを使用できません)。data.tableソリューションを入力として遅延量のある関数として使用するのに十分な柔軟性を持たせることに失敗しましたグループ化されたデータの容量不規則な時系列のdplyrカスタムラグ関数

テストデータ:

testdf <- data.frame(group = c(1,1,1,1,1,2,2,2,2,2), 
       counter = c(1,2,3,5,6,7,8,9,11,12), 
       xval = seq(100, 1000, 100)) 
lagamount <- 1 

出力はベクトルでなければなりません:NA 100 200 NA 400 NA 600 700 NA 900

は、これは私が現時点で使用していますものです:

library(dplyr) 
testout <- group_by(testdf, group) %>% 
    mutate(testout = function(x) which((testdf$counter - x) == lagamount)) 

これは、何か(不特定)がベクトルではないというデータ型エラーを与えます。

この建設作業を行う方法はありますか?あるいは、グループ化された変数で不規則な時系列にどのように遅れをとることができますか?

+0

おそらく、あなたは::動物園 'として、関連する' zoo'関数を呼び出しneeded_function() 'とパッケージをロード避けることができます。 – Axeman

+0

また、 'mutate'に関数を提供しており、ベクトルを期待しているので、そのエラーが発生しています。 – Axeman

+0

ありがとう私は明確にすべきです - 動物園は私のマシンにインストールされません、Rccpの依存関係に問題があります。エラーメッセージの解釈のおかげで、別の試みがあります – JenB

答えて

2

dplyrの中でこれを行う唯一の方法は、doを使用するのではなく、最初に暗黙的な欠損値を明示的にしてから後でフィルタリングすることです。

変異するベクターを入力し、ifelse(またはおそらくは新しいdplyr::if_else)を使用して、遅延が望むものであるかどうかを確認します。例:

library(tidyr) 
lagamount <- 2 

testout <- group_by(testdf, group) %>% 
    complete(group, counter = min(counter):max(counter)) %>% 
    mutate(testout = if_else(counter - lag(counter, lagamount) == lagamount, 
          lag(xval, lagamount), 
          NA_real_)) %>% 
    filter(!is.na(xval)) 

が生成されます

Source: local data frame [10 x 4] 
Groups: group [2] 

    group counter xval testout 
    <dbl> <dbl> <dbl> <dbl> 
1  1  1 100  NA 
2  1  2 200  NA 
3  1  3 300  100 
4  1  5 400  300 
5  1  6 500  NA 
6  2  7 600  NA 
7  2  8 700  NA 
8  2  9 800  600 
9  2  11 900  800 
10  2  12 1000  NA 
+0

ありがとうございます。残念ながら、これは1つの時間単位遅れでしか機能しません。たとえば、前回の2〜3時間単位の値を取り出すことはできません(同時に偶然に前回の観測値でない限り)。これが私が 'と'一緒に働こうとしていた理由です。 – JenB

+0

これで問題は解決します。それ以外の場合は、 'lagamount = 2'の出力を期待できますか? – Axeman

+0

さて、あなたは今何を意味するのですか。別の編集。 – Axeman

0

私は明示的な拡張を作るためになってしまったと私は関数に上記の解答を回すとif_elseに厳格なデータタイピングを削除しました。これが最終的な形式です。

getlag <- function(timevar, valuevar, laglength){ 
    df1 <- data.frame(counter = timevar, value = valuevar, indf = 1) 
    alltimes <- data.frame(counter = seq(min(timevar), max(timevar))) 
    df2 <- merge(alltimes, df1, all.x = TRUE) 
    df2 <- df2 %>% 
    mutate(lagvals = ifelse(counter - lag(counter, laglength) == laglength, 
          lag(value, laglength), 
          NA_real_)) %>% 
    filter(!is.na(indf)) 
    return(df2$lagvals) 
    } 

とテストユースケースである:

testout <- group_by(testdf, group) %>% 
    mutate(testout = getlag(counter, xval, 1)) 
関連する問題