如何有效地将数据帧列设置为等于R中另一列的下48行的总和

时间:2014-04-17 01:40:14

标签: r dataframe apply

我有一个数据框dat,其中包含每小时的流量统计数据dat$x1以及数据框dat$x48中的一列,其中我希望接下来的48行中dat$x1的总和。这是从行所代表的小时开始的48小时音量。

我尝试了一个非常慢的for循环。我的研究表明for循环是一个坏主意,我应该看一下apply函数之一。但是,在检查了对该函数的介绍之后,我无法弄清楚如何使用apply函数。

这是我尝试的for循环,但速度太慢了:

for(i in 1:nrow(dat)){
dat[i,15] <- sum(dat[c(i:i+47),8]) #x1 is in column 8 and x48 is in column 15
}

对于一个简单的例子,我只想要4小时的总和,它会像这样开始:

x1  x4
1   NA
5   NA
3   NA
8   NA
6   NA
2   NA
1   NA
1   NA
...

我希望数据帧最终像这样,其中x4是相应的x1值和下一个3 x1值的总和。

x1  x4
1   17 
5   22
3   19
8   17
6   10
...

数据框有200万行

1 个答案:

答案 0 :(得分:1)

尝试包rollapply

中的功能zoo
lookahead <- 48

dat <- data.frame(x1 = 1:100, x48 = NA)

## you have to calculate number of rows returned by rollapply 
## and only use that many rows.
## i.e (nrow(dat) - lookahead + 1) rows only. 

dat[1:(nrow(dat) - lookahead + 1), "x48"] <- rollapply(dat$x1, width = lookahead, FUN = sum)
dat
##      x1  x48
## 1     1 1176
## 2     2 1224
## 3     3 1272
## 4     4 1320
## 5     5 1368
## 6     6 1416
## 7     7 1464
## 8     8 1512
## 9     9 1560
## 10   10 1608
## 11   11 1656
## 12   12 1704
## 13   13 1752
## 14   14 1800
## 15   15 1848
## 16   16 1896
## 17   17 1944
## 18   18 1992
## 19   19 2040
## 20   20 2088
## 21   21 2136
## 22   22 2184
## 23   23 2232
## 24   24 2280
## 25   25 2328
## 26   26 2376
## 27   27 2424
## 28   28 2472
## 29   29 2520
## 30   30 2568
## 31   31 2616
## 32   32 2664
## 33   33 2712
## 34   34 2760
## 35   35 2808
## 36   36 2856
## 37   37 2904
## 38   38 2952
## 39   39 3000
## 40   40 3048
## 41   41 3096
## 42   42 3144
## 43   43 3192
## 44   44 3240
## 45   45 3288
## 46   46 3336
## 47   47 3384
## 48   48 3432
## 49   49 3480
## 50   50 3528
## 51   51 3576
## 52   52 3624
## 53   53 3672
## 54   54   NA
## 55   55   NA
## 56   56   NA
## 57   57   NA
## 58   58   NA
## 59   59   NA
## 60   60   NA
## 61   61   NA
## 62   62   NA
## 63   63   NA
## 64   64   NA
## 65   65   NA
## 66   66   NA
## 67   67   NA
## 68   68   NA
## 69   69   NA
## 70   70   NA
## 71   71   NA
## 72   72   NA
## 73   73   NA
## 74   74   NA
## 75   75   NA
## 76   76   NA
## 77   77   NA
## 78   78   NA
## 79   79   NA
## 80   80   NA
## 81   81   NA
## 82   82   NA
## 83   83   NA
## 84   84   NA
## 85   85   NA
## 86   86   NA
## 87   87   NA
## 88   88   NA
## 89   89   NA
## 90   90   NA
## 91   91   NA
## 92   92   NA
## 93   93   NA
## 94   94   NA
## 95   95   NA
## 96   96   NA
## 97   97   NA
## 98   98   NA
## 99   99   NA
## 100 100   NA