2017-05-03 7 views
1

時間の経過とともにデータを操作/要約するには、通常、SQL ROW_NUMBER()OVER(PARTITION by ...)を使用します。私はRには新しいので、そうでなければSQLで作成するテーブルを再作成しようとしています。 sqldfパッケージでは、OVER句を使用できません。例テーブル:ROW_NUMBER()をオーバーライドする方法R

ID Day Person Cost 
1  1  A  50  
2  1  B  25  
3  2  A  30  
4  3  B  75  
5  4  A  35  
6  4  B  100  
7  6  B  65  
8  7  A  20  

私は私の最後の表はその2番目のインスタンス(いずれも4日目)の後に日ごとに、前の2つのインスタンスの平均値を含める:

ID Day Person Cost  Prev2 
5  4  A  35  40 
6  4  B  100 50 
7  6  B  65  90 
8  7  A  20  35 

私がしようとしてきましたaggregateで遊ぶことができますが、私は実際にどのように機能を分割したり修飾したりするのかは分かりません。理想的には、私はidが私の答えを形成する日付と逐次的であるという事実を使用したくないです(元のテーブルはランダムな日付順で並び替えることができ、コードはまだ動作します)。あなたの助けを借りて、より多くの詳細が必要な場合はお知らせください!あなたはdplyr 2.の幅とzoo::rollapplyrに遅れる可能性が

+0

PostgreSQLバックエンドを使用する場合は、sqldfでOVERを使用できます。 –

答えて

0

library(dplyr) 

df %>% arrange(Day) %>% # sort 
    group_by(Person) %>% # set grouping 
    mutate(Prev2 = lag(zoo::rollapplyr(Cost, width = 2, FUN = mean, fill = NA))) 
#> Source: local data frame [8 x 5] 
#> Groups: Person [2] 
#> 
#>  ID Day Person Cost Prev2 
#> <int> <int> <fctr> <int> <dbl> 
#> 1  1  1  A 50 NA 
#> 2  2  1  B 25 NA 
#> 3  3  2  A 30 NA 
#> 4  4  3  B 75 NA 
#> 5  5  4  A 35 40.0 
#> 6  6  4  B 100 50.0 
#> 7  7  6  B 65 87.5 
#> 8  8  7  A 20 32.5 

または全てdplyrで、同じものを返し

df %>% arrange(Day) %>% group_by(Person) %>% mutate(Prev2 = (lag(Cost) + lag(Cost, 2))/2) 

。ベースには、

df <- df[order(df$Day), ] 

df$Prev2 <- ave(df$Cost, df$Person, FUN = function(x){ 
    c(NA, zoo::rollapplyr(x, width = 2, FUN = mean, fill = NA)[-length(x)]) 
}) 

df 
#> ID Day Person Cost Prev2 
#> 1 1 1  A 50 NA 
#> 2 2 1  B 25 NA 
#> 3 3 2  A 30 NA 
#> 4 4 3  B 75 NA 
#> 5 5 4  A 35 40.0 
#> 6 6 4  B 100 50.0 
#> 7 7 6  B 65 87.5 
#> 8 8 7  A 20 32.5 

や動物園ずに、同じことを行い

df$Prev2 <- ave(df$Cost, df$Person, FUN = function(x){ 
    (c(NA, x[-length(x)]) + c(NA, NA, x[-(length(x) - 1):-length(x)]))/2 
}) 

NA行を削除する場合は、tidyr::drop_na(Prev2)またはna.omitをタックします。

+0

返信いただきありがとうございます!私は別のチュートリアルでdplyrを使ってきましたが、自分の "プロジェクト"のために使ったことはありません。ダイビングする時間 – CoolGuyHasChillDay

関連する問題