data.frame中的平均行及其上一行

data.frame中的平均行及其上一行,r,performance,plyr,R,Performance,Plyr,我在R中编写了以下函数,用于计算列名为date YYYY-MM-DD、ID、VAR1和VAR2的dataframe的每个日期和前一天的两天平均变量。没有遗漏日期 df <- data.frame TWODAY <- function(df){ df$TWODAY_VAR1 <- NA for(j in 2:length(df$VAR1)){ df$TWODAY_VAR1[j] <- mean(df$VAR1[j:(j-1)]) } df$TWODAY_VAR2 &

我在R中编写了以下函数,用于计算列名为date YYYY-MM-DD、ID、VAR1和VAR2的dataframe的每个日期和前一天的两天平均变量。没有遗漏日期

df <- data.frame

TWODAY <- function(df){

df$TWODAY_VAR1 <- NA
for(j in 2:length(df$VAR1)){
df$TWODAY_VAR1[j] <- mean(df$VAR1[j:(j-1)])
 }

df$TWODAY_VAR2 <- NA
for(j in 2:length(df$VAR2)){
df$TWODAY_VAR2[j] <- mean(df$VAR2[j:(j-1)])
}

return(df)
}
然后,我使用ddply将此函数应用于我的数据帧:

df <- ddply(df, "ID", TWODAY)
然而,我的数据帧包含超过13000000个观测值,而且运行速度非常慢。有人对我如何编辑代码以提高效率有什么建议吗

任何建议都将不胜感激

解决方案使用:

cbind两个向量cbinddf$VAR1,cdf$VAR1[-1],最后一行为NA,应用行平均值。

解决方案使用:


cbind两个向量cbinddf$VAR1,cdf$VAR1[-1],最后一行为NA,应用行均值。

手动向量化:

FOO <- function(x){
  c(NA, (x[2:length(x)]+x[1:(length(x)-1)])/2)
}
例如:

set.seed(123)
df <- data.frame(VAR1 = rnorm(10000), VAR2 = runif(10000))

> head(df)
         VAR1      VAR2
1 -0.56047565 0.9911234
2 -0.23017749 0.3022307
3  1.55870831 0.4337590
4  0.07050839 0.1605209
5  0.12928774 0.8230267
6  1.71506499 0.2080906

df$TWODAY_VAR1 <- FOO(df$VAR1)
df$TWODAY_VAR2 <- FOO(df$VAR2)

> head(df)
         VAR1      VAR2 TWODAY_VAR1 TWODAY_VAR2
1 -0.56047565 0.9911234          NA          NA
2 -0.23017749 0.3022307 -0.39532657   0.6466770
3  1.55870831 0.4337590  0.66426541   0.3679948
4  0.07050839 0.1605209  0.81460835   0.2971400
5  0.12928774 0.8230267  0.09989806   0.4917738
6  1.71506499 0.2080906  0.92217636   0.5155586
这应该是相当快的,即使有1300万行。对我来说,一百万行需要一秒钟的时间

具有13.000.000行的单个变量的基准:

> b
Unit: seconds
                           expr      min       lq      mean    median        uq       max neval
 df$TWODAY_VAR1 <- FOO(df$VAR1) 0.182657 0.209106 0.2308234 0.2175971 0.2239455 0.3119504    10

手动矢量化:

FOO <- function(x){
  c(NA, (x[2:length(x)]+x[1:(length(x)-1)])/2)
}
例如:

set.seed(123)
df <- data.frame(VAR1 = rnorm(10000), VAR2 = runif(10000))

> head(df)
         VAR1      VAR2
1 -0.56047565 0.9911234
2 -0.23017749 0.3022307
3  1.55870831 0.4337590
4  0.07050839 0.1605209
5  0.12928774 0.8230267
6  1.71506499 0.2080906

df$TWODAY_VAR1 <- FOO(df$VAR1)
df$TWODAY_VAR2 <- FOO(df$VAR2)

> head(df)
         VAR1      VAR2 TWODAY_VAR1 TWODAY_VAR2
1 -0.56047565 0.9911234          NA          NA
2 -0.23017749 0.3022307 -0.39532657   0.6466770
3  1.55870831 0.4337590  0.66426541   0.3679948
4  0.07050839 0.1605209  0.81460835   0.2971400
5  0.12928774 0.8230267  0.09989806   0.4917738
6  1.71506499 0.2080906  0.92217636   0.5155586
这应该是相当快的,即使有1300万行。对我来说,一百万行需要一秒钟的时间

具有13.000.000行的单个变量的基准:

> b
Unit: seconds
                           expr      min       lq      mean    median        uq       max neval
 df$TWODAY_VAR1 <- FOO(df$VAR1) 0.182657 0.209106 0.2308234 0.2175971 0.2239455 0.3119504    10

我认为这个问题的合适位置是。你应该给出一个可复制的例子。我认为这个问题的合适位置是。你应该给出一个可复制的例子NA不应该在前面?NA不应该在前面?