2016-09-05 7 views
0

データフレームがあり、各ID内の連続したエントリの差を計算する必要がありますが、IDごとに個別のデータフレームを作成しなくても、現在のソリューション)。ここでは、データフレームと同様の構造を使用した例を示します。データフレームの各サブセット内で関数を適用

df = as.data.frame(matrix(nrow = 20,ncol =2)) 
names(df) = c("ID","number") 
df$ID = sample(c("A","B","C"),20,replace = T) 
df$number = rnorm(20,mean = 5) 

私は簡単しかし、私は、各ID内でこれを実行したいこの機能

roll.dif <-function(x) { 
difference = rollapply(x,width = 2, diff, fill=NA, align = "right") 
return(difference) 
} 

df$dif = roll.dif(df$number) 

を使用して、連続する行の間の差を計算することができます。私はまた、私が探しています答えを与えるどちらも

by(df$number,df$ID,FUN = roll.dif) 

で使用して試してみました

with(df, tapply(number, ID, FUN = roll.dif)) 

としてこの回答Apply function conditionallyに基づいて使用して試してみましたが、私はどのように把握することはできませんそれらをデータフレームに戻す。私は、出力は次のようになりたいと思います:

ID number  dif 
1 A 3.967251  NA 
2 B 3.771882  NA 
3 A 5.920705  1.953454 
4 A 7.517528  1.596823 
5 B 5.252357  3.771882 
6 B 4.811998 -0.440359 
7 B 3.388951 -1.423047 
8 A 5.284527 -2.233001 
9 C 6.070546  NA 
10 A 5.319934  0.035407 
11 A 5.517615  0.197681 
12 B 5.454738  2.065787 
13 C 6.402359  0.331813 
14 C 5.617123 -0.785236 
15 A 5.692807  0.175192 
16 C 4.902007 -0.715116 
17 B 4.975184 -0.479554 
18 A 6.05282  0.360013 
19 C 3.677114 -1.224893 
20 C 4.883414  1.2063 

答えて

2

あなたは私たちがdata.table

library(data.table) 
setDT(df)[, dif := roll.dif(number), by = ID] 

それともbase Rオプションでを使用することができ、この

df %>% group_by(ID) %>% mutate(dif=roll.dif(number)) 
1

ようdplyrパッケージを使用することができますave

df$dif <- with(df, ave(number, ID, FUN = roll.dif)) 
関連する問題