データフレームがあり、各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