2017-05-28 1 views
0

データフレーム(データテーブル)の上記N + 1行をグループごとに合計する関数が必要です。(カスタム関数を使用して)グループ単位でデータテーブル(データフレーム)のN行を合計する

ベクトルの同等の機能は、以下のようになります。

Function1<-function(x,N){ 
    y<-vector(length=length(x)) 
for (i in 1:length(x)) 
if (i<=N) 
    y[i]<-sum(x[1:i]) 
else if (i>N) 
    y[i]<-sum(x[(i-N):i]) 
return(y)} 

Function1(c(1,2,3,4,5,6),3) 
#[1] 1 3 6 10 14 18 # Sums previous (above) 4 values (rows) 

を(下の機能が非効率的である場合はご容赦ください)私は

sapply(X=DF<-data.frame(A=c(1:10), B=2), FUN=Function1(N=3)) 

...以下のように、sapplyでこの機能を使用していたけど..私は把握できなかったことができなかったので、私の関数でxのデフォルトを設定する方法。したがって、私はdata.framesのための別の関数を構築しました。

Function2<-function(x, N) 
if(is.data.frame(x)) { 
y<-data.frame() 
for(j in 1:ncol(x)) 
    for(i in 1:nrow(x)) 
    if (i<=N) { 
     y[i,j]<-sum(x[1:i,j]) 
    } else if (i>N) { 
     y[i,j]<-sum(x[(i-N):i,j])} 
return(y)} 

DF<-data.frame(A=c(1:10), B=2) 
Function2(DF, 2) 
# V1 V2 
1 1 2 
2 3 4 
3 6 6 
4 9 6 
5 12 6 
6 15 6 
7 18 6 
8 21 6 
9 24 6 
10 27 6 

ただし、これをグループ単位で実行する必要があります。たとえば、文字列を含む次のデータフレームの場合。

DF<-data.frame(Name=rep(c("A","B"),each=5), A=c(1:10), B=2) 

私は「名前」グループで、私の関数を適用したいと思います - につながるどの

A 1 2 
A 3 4 
A 6 6 
A 9 6 
A 12 6 
B 6 2 
B 13 4 
B 21 6 
B 24 6 
B 27 6 


#Perform function2 separately for group A and B. 

私は(=グループによる)data.tableパッケージに機能を使用することを期待していました。しかし、どのように把握できませんでした。

これを行うにはどうすればよいでしょうか? 「名前」によるdata.tableで (私は私の機能1がsapplyで動作するようにする方法を学ぶことができればまた、それは、本当にいいだろう)

答えて

1

、我々はグループ、.SDcolsに指定された関心の列をループ(ここでは、すべての興味があるので列を指定しません)。Function1

library(data.table) 
setDT(DF)[, lapply(.SD, Function1, 2), Name] 
# Name A B 
# 1: A 1 2 
# 2: A 3 4 
# 3: A 6 6 
# 4: A 9 6 
# 5: A 12 6 
# 6: B 6 2 
# 7: B 13 4 
# 8: B 21 6 
# 9: B 24 6 
#10: B 27 6 
関連する問題