7

次のような個別のx値を持つデータがあります

x = c(3,8,13,8,13,3,3,8,13,8,3,8,8,13,8,13,8,3,3,8,13,8,13,3,3)
y = c(4,5,4,6,7,20,1,4,6,2,6,8,2,6,7,3,2,5,7,3,2,5,7,3,2);

x値とy値の新しいデータセットを生成するにはどうすればよいですか。ここで、y値がそのビンの平均より2標準偏差高い値のペアを削除します。たとえば、x = 3のビンでは、20は平均より2 SD以上高いため、データポイントを削除する必要があります。

4

3 に答える 3

7

私にとっては、次のようなものが必要です:

 by(dat,dat$x, function(z) z$y[z$y < 2*sd(z$y)])
dat$x: 3
[1] 4 1 6 5 7 3 2
--------------------------------------------------------------------------------------------------------------- 
dat$x: 8
[1] 4 2 2 2 3
--------------------------------------------------------------------------------------------------------------- 
dat$x: 13
[1] 3 2

コメントの後に編集:

 by(dat,dat$x, 
           function(z) z$y[abs(z$y-mean(z$y))< 2*sd(z$y)])

編集

関数を少し変更して x と y を取得し、次を使用してby呼び出しますrbinddo.call

   do.call(rbind,by(dat,dat$x,function(z) {
                              idx <- abs(z$y-mean(z$y))< 2*sd(z$y)
                              z[idx,]
            }))

またはplyr単一の呼び出しで使用する

 ddply(dat,.(x),function(z) {
                 idx <- abs(z$y-mean(z$y))< 2*sd(z$y)
                  z[idx,]})
于 2013-03-01T15:00:09.977 に答える
2

これを使用することはできますtapplyが、元の注文は失われます。

tapply(y,x,function(z) z[abs(z-mean(z))<2*sd(z)])
$`3`
[1] 4 1 6 5 7 3 2

$`8`
 [1] 5 6 4 2 8 2 7 2 3 5

$`13`
[1] 4 7 6 6 3 2 7
于 2013-03-01T15:08:46.593 に答える
2

このようなもの?

newdata <- cbind(x,y)[-which(y>2*sd(y)), ]

または、このようなことを意味しますか?

Data <- cbind(x,y)
Data[-which(sd(y)>rowMeans(Data)), ]
于 2013-03-01T14:50:02.250 に答える