按组操作

时间:2015-11-06 08:06:29

标签: r data.table

我的数据集如下。我有Col1Col2Col3。 我需要创建第4列(Mean),该列为组计算为该行的Col3的值除以最后3的总和(可能必须更改为4,5,6)。 需要使用col1为每个组完成此操作。

   Col1   Col2 Col3      Mean
1     A Jan-13  695        NA
2     A Feb-13  993        NA
3     A Mar-13  921        NA
4     A Apr-13  595 0.6841702
5     A May-13  632 0.7556796
6     A Jun-13  582 0.8128492
7     A Jul-13  810 1.3432836
8     A Jul-13  804 1.1916996
9     A Aug-13  927 1.2663934
10    A Sep-13  500 0.5903188
11    A Oct-13  719 0.9668310
12    A Nov-13  933 1.3042870
13    A Dec-13  844 1.1765799
14    A Jan-14  942 1.1322115
15    A Feb-14  753 0.8308202
16    A Mar-14  567 0.6699488
17    A Apr-14  507 0.6724138
18    A May-14  517 0.8489327
19    B Jan-13  835        NA
20    B Feb-13  892        NA
21    B Mar-13  510        NA
22    B Apr-13  615 0.8247653
23    B May-13  501 0.7451661
24    B Jun-13  617 1.1383764
25    B Jul-13  951 1.6462781
26    B Jul-13  632 0.9163847
27    B Aug-13  885 1.2068182
28    B Sep-13  821 0.9979741
29    B Oct-13  844 1.0829769
30    B Nov-13  587 0.6905882
31    B Dec-13  663 0.8832149
32    B Jan-14  614 0.8796562
33    B Feb-14  775 1.2473176
34    B Mar-14  688 1.0058480
35    B Apr-14  963 1.3909485
36    B May-14  934 1.1549876
37    C Jan-13  567        NA
38    C Feb-13  972        NA
39    C Mar-13  618        NA
40    C Apr-13  839 1.1668985
41    C May-13  747 0.9226019
42    C Jun-13  574 0.7813067
43    C Jul-13  718 0.9972222
44    C Jul-13  704 1.0358019
45    C Aug-13  982 1.4759519
46    C Sep-13  528 0.6589018
47    C Oct-13 1000 1.3550136
48    C Nov-13  609 0.7278884
49    C Dec-13  980 1.3757604
50    C Jan-14  611 0.7079954
51    C Feb-14  604 0.8236364
52    C Mar-14  674 0.9211845
53    C Apr-14  978 1.5532028
54    C May-14  885 1.1768617
55    D Jan-13  677        NA
56    D Feb-13  620        NA
57    D Mar-13  652        NA
58    D Apr-13  934 1.4376603
59    D May-13  817 1.1110607
60    D Jun-13  665 0.8302122
61    D Jul-13  761 0.9449503
62    D Jul-13  828 1.1074454
63    D Aug-13  659 0.8771074
64    D Sep-13  574 0.7660142
65    D Oct-13  785 1.1426492
66    D Nov-13  622 0.9246779
67    D Dec-13  704 1.0661282
68    D Jan-14  945 1.3429654
69    D Feb-14  971 1.2826948
70    D Mar-14  975 1.1164122
71    D Apr-14  539 0.5593220
72    D May-14  881 1.0635815

目前我正在创建从1到6的滞后,然后使用它们来创建新列。这是非常耗时的,因为我必须为大约20列进行此操作。

有更快/更有效的方法吗?最好使用data.table

2 个答案:

答案 0 :(得分:3)

你可以试试那个popose的shift函数

library(data.table) ## v1.9.6+
N <- 3L ## Set whatever N you like
setDT(df1)[, Mean := Col3 / (Reduce(`+`, shift(Col3, 1:N)) / N), by = Col1]
head(df1)
#    Col1   Col2 Col3      Mean
# 1:    A Jan-13  695        NA
# 2:    A Feb-13  993        NA
# 3:    A Mar-13  921        NA
# 4:    A Apr-13  595 0.6841702
# 5:    A May-13  632 0.7556796

答案 1 :(得分:0)

我们可以将embedsplit

一起使用
unsplit(lapply(split(df1$Col3, df1$Col1), function(x) 
           x/head(rowMeans(embed(c(rep(NA,3), x), 3)),-1)), df1$Col1)