0

我有一个存储在 R 数据框中的表。

我想计算每列的一阶导数。列是测量变量,行是时间。

我可以矢量化这个函数吗?

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

原则上我想要类似的东西:

df$DiffA <- diff(df$A)

问题是,我不知道如何向量化需要A(n) 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返回比输入向量中的值少一个的值(原因很明显)。您可以通过预先或附加一个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速度很快,但对于使用 a 的大数据集data.frame效率不高。改为使用data.table。数据集越大,速度增益越明显。

于 2012-09-28T13:00:51.807 回答
0

你可以试试lag()ordiff()函数。他们似乎会做你想做的事。

于 2012-09-28T12:43:27.170 回答