4

バツ

Team Date       Score
A    1-1-2012   80
A    1-2-2012   90
A    1-3-2012   50
A    1-4-2012   40   
B    1-1-2012   100
B    1-2-2012   60
B    1-3-2012   30
B    1-4-2012   70
etc

このデータフレームを、すべての観測値と日付を見出しとして、チームごとに1行のワイドデータフレームに変換する必要があります。

xx

Team 1-1-2012 1-2-2012  1-3-2012 1-4-2012
A    80       90        50        40
B    100     60         30        70  

各行の平均とsdを計算する必要があります。これは、次のように実行できます。

xx

Team 1-1-2012 1-2-2012  1-3-2012 1-4-2012  mean   sd
A    80       90        50        40       75    20
B    100     60         30        70       55    10 

データフレームxxに数千の行があることを考慮してください。次のように各セルの計算を行いたいと思います。

abs(xx-Mean)> 3 * SDの場合、カウンター列名を作成し、値をインクリメントします。アイデアは、各観測値を平均およびsdと比較し、特定のチームの各観測値がこれに一致する場合(abs(xx-Mean)> 3 * SD)、カウンターをインクリメントすることです。各セルを確認した後、各チームの各カウンターを調べて、カウンター値が最も高い上位10チームを取得したいと思います。基本的に、私は最も外れ値を検出しようとしています。トップ10のチーム名を取得したら、データフレームxに時系列データをグラフ化します。

これを本来よりも複雑にしないことを願っています。確かではありませんが、Rにはすでに各セルで計算を行う機能があります。これを達成するためのアイデアはありがたいですか?

4

2 に答える 2

6

私はあなたのデータを長い形式のままにし、、、、plyrまたはdata.table他の分割-適用-結合ツールのいずれかを使用して統計を計算します。これが私plyrがタスクに使用する方法です:

#Your data
dat <- read.table(text = "Team Date       Score
A    1-1-2012   80
A    1-2-2012   90
A    1-3-2012   50
A    1-4-2012   40   
B    1-1-2012   100
B    1-2-2012   60
B    1-3-2012   30
B    1-4-2012   70", header = TRUE)

library(plyr)

#Compute mean and sd by team
dat <- ddply(dat, .(Team), transform, mean = mean(Score), sd = sd(Score))
#Your outlier threshold
dat <- transform(dat, outlier = abs(Score - mean) > 3*sd)
#Cumulative sum by team
dat <- ddply(dat, .(Team), transform, cumsumOutlier = cumsum(outlier))

これを出力として提供します(これはあなたの例とは一致しませんが、おそらく実際のデータは一致します):

 Team     Date Score mean       sd outlier cumsumOutlier
1    A 1-1-2012    80   65 23.80476   FALSE             0
2    A 1-2-2012    90   65 23.80476   FALSE             0
3    A 1-3-2012    50   65 23.80476   FALSE             0
4    A 1-4-2012    40   65 23.80476   FALSE             0
5    B 1-1-2012   100   65 28.86751   FALSE             0
6    B 1-2-2012    60   65 28.86751   FALSE             0
7    B 1-3-2012    30   65 28.86751   FALSE             0
8    B 1-4-2012    70   65 28.86751   FALSE             0
于 2012-10-15T01:44:00.187 に答える
5

long-formatdata.tableアプローチ_

DT <- read.table( 'clipboard', header = T)
library(data.table)
DT <- as.data.table(DT)
DT[, mean.score := mean(Score), by = Team]
##    Team     Date Score mean.score
## 1:    A 1-1-2012    80         65
## 2:    A 1-2-2012    90         65
## 3:    A 1-3-2012    50         65
## 4:    A 1-4-2012    40         65
## 5:    B 1-1-2012   100         65
## 6:    B 1-2-2012    60         65
## 7:    B 1-3-2012    30         65
## 8:    B 1-4-2012    70         65
DT[, sd.score := sd(Score), by = Team]
##    Team     Date Score mean.score sd.score
## 1:    A 1-1-2012    80         65 23.80476
## 2:    A 1-2-2012    90         65 23.80476
## 3:    A 1-3-2012    50         65 23.80476
## 4:    A 1-4-2012    40         65 23.80476
## 5:    B 1-1-2012   100         65 28.86751
## 6:    B 1-2-2012    60         65 28.86751
## 7:    B 1-3-2012    30         65 28.86751
## 8:    B 1-4-2012    70         65 28.86751
DT[, outlier := abs(Score-mean.score) > 3 * sd.score, by = Team]
##    Team     Date Score mean.score sd.score outlier
## 1:    A 1-1-2012    80         65 23.80476   FALSE
## 2:    A 1-2-2012    90         65 23.80476   FALSE
## 3:    A 1-3-2012    50         65 23.80476   FALSE
## 4:    A 1-4-2012    40         65 23.80476   FALSE
## 5:    B 1-1-2012   100         65 28.86751   FALSE
## 6:    B 1-2-2012    60         65 28.86751   FALSE
## 7:    B 1-3-2012    30         65 28.86751   FALSE
## 8:    B 1-4-2012    70         65 28.86751   FALSE

または、1つのステップで

DT[, outlier := abs(Score-mean(Score)) > 3 *  sd(Score), by = Team]

外れ値の数を追加するには(論理変数の合計は0,1に強制されます)

DT[, sum.outlier := sum(outlier), by = Team]
于 2012-10-15T01:40:05.090 に答える