1

グループごとの多変量外れ値を検出するために、ddplyを使用してdata.frame全体で多変量関数を解析しようとしています。mvoutlierパッケージのsign1関数のwfinal01値を使用して、1(インライア)と0(アウトライア)を含むベクトルまたは新しい列を取得することを期待しています。次のコードは、私がまだ試したが成功しなかった例です。

library(plyr)
library(mvoutlier)
data(coffee)
myFunc<- function(X) sign1(unclass(X), qcrit=0.975)$wfinal01
ddply(coffee, .(sort), transform, outliers=myFunc(c(Metpyr, `5-Met`, furfu)))

次のエラーメッセージが返されます。

Erreur dans apply(x, 2, mad) : dim(X) must have a positive length
4

1 に答える 1

3

問題は、c3つの列を含む行列を渡す数値ベクトルを作成することです。これを行うために使用できますcbind

ddply(coffee, .(sort), transform, outliers=myFunc(cbind(Metpyr, `5-Met`, furfu)))
   Metpyr X5.Met furfu    sort outliers
1   12.50   8.51  6.20 arabica        0
2    5.33  11.80 17.80 arabica        1
3    2.56   7.16 13.67 arabica        0
4    8.59   8.40 14.39 arabica        1
5    8.22  14.86 20.35 arabica        1
6    7.73  12.23 21.02 arabica        1
7    6.07  12.60 14.25 arabica        1
8    5.88  11.19 15.39 arabica        1
9   10.34  11.90  9.81 arabica        1
10   6.26  10.49 16.90 arabica        1
11   5.47  15.04 24.87 arabica        1
12   1.39  12.76 19.51 arabica        1
13   5.10  13.42 16.93 arabica        1
14   3.72  12.65 21.35 arabica        1
15   4.33  12.72 18.47 arabica        1
16   7.38  15.00 21.58 arabica        1
17  12.13  11.68 15.59 blended        1
18  14.41   8.99 16.42 blended        1
19   8.86   6.98  8.40 blended        1
20  15.47   5.89  5.37 blended        1
21   7.55  13.74 22.26 blended        1
22  14.47   8.76 11.28 blended        1
23  11.34  12.62 14.15 blended        1
24  14.25   8.02  8.69 blended        1
25   6.85  13.38 23.83 blended        1
26   9.93   9.05  7.52 blended        1
27   8.59  14.29 18.50 blended        1

ベクトルは1次元しかないapplyため、2次元を超える行列または配列が必要です(したがってエラー)


編集-列による参照

列番号による参照は危険だと思いますが、これを使用する場合は可能です。data.table

data.tableよりも高速で効率的ですddply

library(data.table)
CD <- data.table(coffee)

CD[, outlier := sign1(.SD, qcrit = 0.975)$wfinal01,by = sort, .SDcols = 1:3]
CD
    Metpyr 5-Met furfu    sort outlier
 1:  12.50  8.51  6.20 arabica       0
 2:   5.33 11.80 17.80 arabica       1
 3:   2.56  7.16 13.67 arabica       0
 4:   8.59  8.40 14.39 arabica       1
 5:   8.22 14.86 20.35 arabica       1
 6:   7.73 12.23 21.02 arabica       1
 7:   6.07 12.60 14.25 arabica       1
 8:   5.88 11.19 15.39 arabica       1
 9:  10.34 11.90  9.81 arabica       1
10:   6.26 10.49 16.90 arabica       1
11:   5.47 15.04 24.87 arabica       1
12:   1.39 12.76 19.51 arabica       1
13:   5.10 13.42 16.93 arabica       1
14:   3.72 12.65 21.35 arabica       1
15:   4.33 12.72 18.47 arabica       1
16:   7.38 15.00 21.58 arabica       1
17:  12.13 11.68 15.59 blended       1
18:  14.41  8.99 16.42 blended       1
19:   8.86  6.98  8.40 blended       1
20:  15.47  5.89  5.37 blended       1
21:   7.55 13.74 22.26 blended       1
22:  14.47  8.76 11.28 blended       1
23:  11.34 12.62 14.15 blended       1
24:  14.25  8.02  8.69 blended       1
25:   6.85 13.38 23.83 blended       1
26:   9.93  9.05  7.52 blended       1
27:   8.59 14.29 18.50 blended       1
    Metpyr 5-Met furfu    sort outlier

c('Metpyr', `5-Met`, 'furfu').SDcolsへの引数と同じくらい簡単に(そしてより明示的に)渡すことができます。

于 2012-12-17T04:32:27.810 に答える