2016-07-13 12 views
-1

グループごとに7日間の差異を作成しようとしています。したがって、私は以下のコードを複製し、7日間の遅れで同様の結果を得ることを望んでいます。グループごとのdplyr突然変異の相違

library(dplyr) 

dat %>% mutate(dx=c(NA, diff(x)), dy=c(NA, diff(y))) 

    x y dx dy 
1 5 3 NA NA 
2 8 9 3 6 
3 3 1 -5 -8 
4 1 5 -2 4 

しかし、私はエラーメッセージを取得しています:

Error: incompatible size (900), expecting 905 (the group size) or 1

は、このエラーを修正するために迅速かつ簡単な方法があります。私はそれが突然変異と関係しているかもしれないと確信しています

+0

入力例を示してください。出力に基づいて、 'colname1、colname2'はありません – akrun

+0

[良い質問をする方法](http://stackoverflow.com/help/how-to-ask)と[再現可能な例](http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example/5963610)。これは他の人があなたを助けることをはるかに容易にします。コメントのために – Jaap

+0

感謝します。私のコードと上記の唯一の違いはgroup_byです。 dat%>%group_by(anything)%>%mutate(dx = c(NA、diff(x))、dy = c(NA、diff(y)))私はそれが簡単な修正であることを知っています、私はそれを修正する方法を知らない、私はかなり新しいです。 –

答えて

3

あなたの遅れの日数のためにNAとパッドする必要があります。 1 NAと同じように、1の遅れを持つ最初の行の差分値が足りないために、最初の7行の差分値が足りないために7 NAが必要です。

mtcars %>% 
    mutate(dx = c(NA, diff(mpg)), 
     dx7 = c(rep(NA,7), diff(mpg, 7))) 

またはグループで:ビルトインmtcarsデータフレームを持つ例Axemanの素敵な答え@

mtcars %>% 
    group_by(am) %>% 
    mutate(dx = c(NA, diff(mpg)), 
     dx7 = c(rep(NA,7), diff(mpg, 7))) 

はあなたにも内蔵されている、diffzooパッケージのバージョンを使用することができることを思い出しましたパディングあなただけのna.padを利用可能にする、diff.zoo方法が派遣されますように、代わりにベースR diffの、zoo対象に、あなたのベクトルを変換する必要があります。

library(zoo) 

mtcars %>% 
    mutate(dx = diff(zoo(mpg), na.pad=TRUE), 
     dx7 = diff(zoo(mpg), 7, na.pad=TRUE)) 
+0

ああああ!どうもありがとうございます。出来た! –

1

私は完全にdiffを取り払う提案、およびdplyrを使用します非常に自分のlagです。これは必要なのを処理しますNAの。

mtcars %>% 
    mutate(dx = mpg - lag(mpg), 
     dx7 = mpg - lag(mpg, 7)) 
+1

さて、あなたはコードゴルフで勝ちます! – eipi10

+1

まあ、私は昨年ほどあなたの答えからかなり学んだことがあります。 – Axeman

+1

ありがとう!それは知っていいですね。 – eipi10

関連する問題