0

非常に大きなデータ セット (> 100 万行) があり、同じ日のすべて (たとえば、1 月 1 日すべて、1 月 2 日すべて、...、12 月 31 日すべて) について計算する必要があるパーセンタイルがあります。同じ年、月、日のデータが異なる行が多数あります。以下はデータの例です。

    Year  Month  Day  A  B  C  D
    2007  Jan    1    1  2  3  4
    2007  Jan    1    5  6  7  8
    2007  Feb    1    1  2  3  4
    2007  Feb    1    5  6  7  8
    .
    .
    2010  Dec    30   1  2  3  4
    2010  Dec    30   5  6  7  8
    2010  Dec    31   1  2  3  4
    2010  Dec    31   5  6  7  8

したがって、1 月 1 日の 95 パーセンタイルを計算するには、すべての年 (例: 2007 ~ 2010) とすべての列 (A、B、C、D) のすべての 1 月 1 日を含める必要があります。これは、1 月 2 日、1 月 3 日、...、12 月 30 日、12 月 31 日のすべてに対して行われます。これは、入れ子になった if ステートメントを使用して、Excel の小さなデータ セットで簡単に行うことができます。例: ={PERCENTILE(IF(月($B$2:$B$1000000)="1月",IF(日($C$2:$C$1000000)="1",$D$2:$G$1000000)), 95%)}

パーセンタイルは、月と日のみを含む新しいデータ テーブルに追加できます。

    Month  Day  P95  P05
    Jan    1
    Jan    2
    Jan    3
    .
    .
    Dec    30
    Dec    31

次に、パーセンタイルを使用して、それぞれの日付 (1 月 1 日など) の列名 A、B、C、D の各データ値が P95 より大きいか、P05 より小さいかを評価する必要があります。次に、1 または 0 を含む最初のデータ テーブルに新しい列を追加できます (パーセンタイルよりも大きいか小さい場合は 1、大きくも小さくもない場合は 0)。

    Year  Month  Day  A  B  C  D  A05  B05  C05  D05  A95  B95  C95  D95
    2007  Jan    1    1  2  3  4  1    0    0    0    0    0    0    0
    2007  Jan    1    5  6  7  8  0    0    0    0    0    0    1    1
    .
    .
    2010  Dec    31   5  6  7  8  0    0    0    0    0    0    0    1
4

2 に答える 2

1

私はあなたのデータを呼び出しましたdat

library(plyr)
library(reshape2)

# melt values so all values are in 1 column
dat_melt <- melt(dat, id.vars=c("Year", "Month", "Day"), variable.name="letter", value.name="value")

# get quantiles, split by day
dat_quantiles <- ddply(dat_melt, .(Month, Day), summarise, 
                   P05=quantile(value, 0.05), P95=quantile(value, 0.95))

# merge original data with quantiles
all_dat <- merge(dat_melt, dat_quantiles)

# See if in bounds
all_dat <- transform(all_dat, less05=ifelse(value < P05, 1, 0), greater95=ifelse(value > P95, 1, 0))


   Month Day Year letter value  P05  P95 less05 greater95
1    Dec  30 2010      A     1 1.35 7.65      1         0
2    Dec  30 2010      A     5 1.35 7.65      0         0
3    Dec  30 2010      B     2 1.35 7.65      0         0
4    Dec  30 2010      B     6 1.35 7.65      0         0
5    Dec  30 2010      C     3 1.35 7.65      0         0
6    Dec  30 2010      C     7 1.35 7.65      0         0
7    Dec  30 2010      D     4 1.35 7.65      0         0
8    Dec  30 2010      D     8 1.35 7.65      0         1
9    Dec  31 2010      A     1 1.35 7.65      1         0
10   Dec  31 2010      A     5 1.35 7.65      0         0
11   Dec  31 2010      B     2 1.35 7.65      0         0
12   Dec  31 2010      B     6 1.35 7.65      0         0
13   Dec  31 2010      C     3 1.35 7.65      0         0
14   Dec  31 2010      C     7 1.35 7.65      0         0
15   Dec  31 2010      D     4 1.35 7.65      0         0
16   Dec  31 2010      D     8 1.35 7.65      0         1
17   Feb   1 2007      A     1 1.35 7.65      1         0
18   Feb   1 2007      A     5 1.35 7.65      0         0
19   Feb   1 2007      B     2 1.35 7.65      0         0
20   Feb   1 2007      B     6 1.35 7.65      0         0
21   Feb   1 2007      C     3 1.35 7.65      0         0
22   Feb   1 2007      C     7 1.35 7.65      0         0
23   Feb   1 2007      D     4 1.35 7.65      0         0
24   Feb   1 2007      D     8 1.35 7.65      0         1
25   Jan   1 2007      A     1 1.35 7.65      1         0
26   Jan   1 2007      A     5 1.35 7.65      0         0
27   Jan   1 2007      B     2 1.35 7.65      0         0
28   Jan   1 2007      B     6 1.35 7.65      0         0
29   Jan   1 2007      C     3 1.35 7.65      0         0
30   Jan   1 2007      C     7 1.35 7.65      0         0
31   Jan   1 2007      D     4 1.35 7.65      0         0
32   Jan   1 2007      D     8 1.35 7.65      0         1
于 2013-02-21T05:54:36.387 に答える
0

これらの行に沿ったものは、元のデータフレームにマージできます。

aggregate(dfrm[ , c("A","B","C","D")] , list(dfrm$month, dfrm$day), 
                                              FUN=quantile, probs=c(0.05,0.95))

私が提案したことに注意してくださいmerge()。あなたの説明は、すべての年分の 1 月 1 日の値を一緒に送信することを望んでいることを示唆していました (ただし明示的ではありませんでした)。これは、Excel で使用している式よりもはるかに「簡単」だと思います。これは、4 つの列すべてで 0.05 と 0.95 の両方を行います。

于 2013-02-21T07:56:08.847 に答える