2016-09-09 9 views
-2

でグループを使用してrollmean私は以下のようにデータフレームを持っている:Rのdplyr - 列

(データはフォーマットに従っていない場合は、画像を見つける。)

Sample Data      
date id name loc mean count mean 
9/6/2016 kar1 AAA 100004 0 1 
9/8/2016 kar1 AAA 100004 0 3 
9/9/2016 kar1 AAA 100004 0 4 
9/10/2016 kar1 AAA 100004 0 5 
9/11/2016 kar1 AAA 100004 0 6 
9/12/2016 kar1 AAA 100004 0 7 
9/13/2016 kar1 AAA 100004 0 8 
9/14/2016 kar1 AAA 100004 0 9 
9/7/2016 blr1 BBB 100004 0 2 

((7日間のローリングを計算しようとしています平均値))3日平均(前3日および3日後) カウントフィールドのid、name、locに基づいていますが、結果は期待どおりではありません。

コードの下に見つける:

fnrollmean <- function(x) rollmean(df$count,7,na.pad=TRUE,align="center") 

rollmeandf <- df %>% group_by(id,name,loc) %>% arrange(id,name,loc) %>% mutate(funs=fnrollmean(df$count)) 

私はエラーを取得する:evalの中

エラー(代替(expr)は、ENVIR、enclos):互換性のないサイズ (9)、8を期待して(グループサイズ)または1

私はちょうどない場合:

test2 <- df %>% mutate(funs=fnrollmean(df$count)) 

これは機能しますが、間違っているすべての病気を考慮して計算されます。

何か不足していることや回避策がある場合は教えてください。

期待される結果:

date id name loc mean count mean 
9/6/2016 kar1 AAA 100004 0 1 NA 
9/8/2016 kar1 AAA 100004 0 3 NA 
9/9/2016 kar1 AAA 100004 0 4 NA 
9/10/2016 kar1 AAA 100004 0 5 4.8 
9/11/2016 kar1 AAA 100004 0 6 6 
9/12/2016 kar1 AAA 100004 0 7 NA 
9/13/2016 kar1 AAA 100004 0 8 NA 
9/14/2016 kar1 AAA 100004 0 9 NA 
9/7/2016 blr1 BBB 100004 0 2 NA 

sample data in image

おかげ

+0

あなた 'fnrollmean'機能が渡される 'X' 引数を使用する必要がありますそれを( 'df $ count'の代わりに)入れます。 mutateの呼び出しでは、 'df $ count'ではなく' count'を使うべきです。しかし、これらの変更を加えてもエラーが発生します。私は、_zoo_パッケージにはまだ詳しくは触れていない。 – jdobres

答えて

2

mutateを使用するには、入力されるベクトル(S)と同じ長さのベクトルを返すウィンドウ関数を持っている必要があります関数(またはスカラー値で満たされた長さのベクトルに強制的に変換されるスカラーを返します)。問題はあなたのfnrollmeanがエラーではないということです。 2番目のグループ(blr1, BBB, 100004)には1行しかないので、投稿された入力データとのjdobreのコメントに従っても、同じタイプのエラーが残ることに注意してください。私たちは関数内xの代わりdf$countを使用するjdobreさんのコメントに続い

library(zoo) 
fnrollmean <- function (x) { 
    if (length(x) < 7) { 
    rep(NA,length(x)) 
    } else { 
    rollmean(x,7,align="center",na.pad=TRUE) 
    } 
} 

注:したがって、fnrollmeanなどを変更します。次に、(再びmutatefnrollmeanを呼び出すときdf$countの代わりにcountを使用するjdobreのコメントを以下):

library(dplyr) 
result <- df %>% group_by(id,name,loc) %>% 
       mutate(rollavg=fnrollmean(count)) 

することはできます:

print(result) 
##Source: local data frame [9 x 7] 
##Groups: id, name, loc [2] 
## 
##  date  id name loc mean count rollavg 
##  <fctr> <fctr> <fctr> <int> <int> <int> <dbl> 
##1 9/6/2016 kar1 AAA 100004  0  1  NA 
##2 9/8/2016 kar1 AAA 100004  0  3  NA 
##3 9/9/2016 kar1 AAA 100004  0  4  NA 
##4 9/10/2016 kar1 AAA 100004  0  5 4.857143 
##5 9/11/2016 kar1 AAA 100004  0  6 6.000000 
##6 9/12/2016 kar1 AAA 100004  0  7  NA 
##7 9/13/2016 kar1 AAA 100004  0  8  NA 
##8 9/14/2016 kar1 AAA 100004  0  9  NA 
##9 9/7/2016 blr1 BBB 100004  0  2  NA 
+0

ありがとうございましたAichao ...それは働いた.. – Ckeng

+0

それが働いたら、人々は質問が答えられたことを知るようにこの答えを受け入れる必要があります。 :) – Ajar

関連する問題