2012-09-28 156 views
0

我有一个存储在R中的数据帧中的表格。向量化R中的差异化

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

我可以矢量化这个功能吗?

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

原则,我想是这样的:

df$DiffA <- diff(df$A) 

的问题是,我不知道该如何向量化需要A(n)A(n+1),其中ñ是功能数据帧内的行(伪代码)。

+0

请详细说明你的伪代码吗?如果使用for循环编写代码更容易,那么我们将看看是否有可能对它进行矢量化...... – digEmAll

+0

好吧,由于行是时间和时间间隔是等间隔的,所以为区分目的可以忽略间隔。因此,我正在搜索'diffA(n)= A(n + 1) - A(n)'。 – Doc

+1

'A [-1] -A [-length(A)]'这本质上就是'diff'的工作方式 – James

回答

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。速度增益变得更明显,数据集越大。

+0

谢谢罗兰。这显然解决了编码问题。只有一个小问题:这是否仍然是矢量化的?或者它是通过数据帧循环的函数吗?正如我之前写的,我正面临着一个接近500MB的数据帧(大约有10万次测量)。这会充分表现吗? – Doc

+1

'diff'非常快。如果这还不够,你应该在新的问题中寻求更有效的替代方案。试着让下一次实际询问的内容更加清晰。如果你从一开始就在你的评论中提供了示例代码,那么这个问题的答案可能会快得多。 – Roland

+0

@doc我在我的答案中添加了一些基准。 – Roland

0

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