0

Rのデータフレームに格納されたテーブルがあります。

各列に沿って一次導関数を計算したい。列は測定変数、行は時間です。

この関数をベクトル化できますか?

df$C <- df$A + df$B

原則として、次のようなものが欲しいです:

df$DiffA <- diff(df$A)

A(n) 問題は、 and を必要と する関数をベクトル化する方法がわからないことですA(n+1)。ここで、nはデータフレーム内の行です (疑似コード)。

4

2 に答える 2

1

コメントに基づいて:

df <- data.frame(n=1:100) 
df$sqrt <- sqrt(df$n)
df$diff <- c(NA,diff(df$sqrt,lag=1))

diff入力ベクトルにある値よりも 1 つ少ない値を返します (明らかな理由により)。値を先頭または末尾に追加することで修正できNAます。

いくつかのタイミング:

#create a big data.frame
vec <- 1:1e6
df <- data.frame(a=vec,b=vec,c=vec,d=vec,e=vec,sqroot=sqrt(vec))

#for big datasets data.table is usually more efficient:
library(data.table)
dt <- data.table(df)

#benchmarks
library(microbenchmark)

microbenchmark(df$diff <- c(NA,diff(df$sqroot,lag=1)),
               dt[,diff:=c(NA,diff(sqroot,lag=1))])
Unit: milliseconds
                                            expr      min        lq    median        uq      max
1     df$diff <- c(NA, diff(df$sqroot, lag = 1)) 75.42700 116.62366 140.98300 151.11432 174.5697
2 dt[, `:=`(diff, c(NA, diff(sqroot, lag = 1)))] 37.39592  45.91857  52.21005  62.89996 119.7345

diffは高速ですが、を使用した大きなデータセットdata.frameは効率的ではありません。data.table代わりに使用してください。データセットが大きくなるほど、速度の向上はより顕著になります。

于 2012-09-28T13:00:51.807 に答える
0

lag()またはdiff()関数を試してみてください。彼らはあなたが望むことをしているように見えるでしょう。

于 2012-09-28T12:43:27.170 に答える