我有一个存储在R的数据框中的表。
我想计算每列的一阶导数。列是测量变量,行是时间。
我可以对此功能进行矢量化吗?
df$C <- df$A + df$B
原则上我喜欢这样的东西:
df$DiffA <- diff(df$A)
问题是,我不知道如何对需要A(n)
和 A(n+1)
的函数进行矢量化,其中 n 是行在数据帧内(伪代码)。
答案 0 :(得分: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
速度很快,但对于使用data.frame
的大型数据集效率不高。请改用data.table
。速度增益越明显,数据集越大。
答案 1 :(得分:0)
您可以尝试使用lag()
或diff()
功能。他们似乎做你想做的事。