我有离散 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 bin 中,20 比均值高 2 个 SD 多,因此应删除数据点。
我有离散 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 bin 中,20 比均值高 2 个 SD 多,因此应删除数据点。
对我来说,你想要这样的东西:
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)])
编辑
我稍微改变了by
函数来获取 x 和 y,然后我调用rbind
usingdo.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,]})
像这样的东西?
newdata <- cbind(x,y)[-which(y>2*sd(y)), ]
或者你的意思是这样的?
Data <- cbind(x,y)
Data[-which(sd(y)>rowMeans(Data)), ]
您可以使用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