如何在r中的所需区域中获得点集(x,y)

时间:2017-11-15 16:59:39

标签: r data-cleaning

enter image description here

该图是在excel文件中设置的x,y的图,总共8760对x和y。我想删除红色圆圈区域中的噪声数据对,并输出一个带有剩余数据对的新excel文件。我怎么能在R?中做到这一点?

2 个答案:

答案 0 :(得分:3)

R和EXCEL都读取和写入.csv文件,因此您可以使用它们来回传输数据。

您没有提供任何数据,因此我制作了一些垃圾数据以产生类似的问题。

DATA

set.seed(2017)
x = runif(8760, 0,16)
y = c(abs(rnorm(8000, 0, 1)), runif(760,0,8)) 
XY = data.frame(x,y)

识别噪点的一种方法是查看距离最近邻居的距离。在密集区域,最近的邻居将更近。在非密集区域,它们将进一步分开。包dbscan提供了一个很好的函数来获得与k个最近邻居的距离。对于这个问题,我使用k = 6,但您可能需要调整数据。观察到第6个最近邻居的距离分布,我们看到大多数点在0.2

的距离内有6个邻居
XY6 = kNNdist(XY, 6)
plot(density(XY6[,6]))

Density Plot

因此,我将假设其第6个最近邻居距离较远的点是噪点。只需更改颜色以查看受影响的点,我们就可以了

TYPE = rep(1,8760)
TYPE[XY6[,6] > 0.2] = 2
plot(XY, col=TYPE)

Noise turned red

当然,如果您希望限制非噪点,可以使用

NonNoise = XY[XY6[,6] > 0.2,]

答案 1 :(得分:3)

使用@ G5W&#39的示例:

弥补数据:

set.seed(2017)
x = runif(8760, 0,16)
y = c(abs(rnorm(8000, 0, 1)), runif(760,0,8)) 
XY = data.frame(x,y)

将分位数回归拟合到第90个百分点:

library(quantreg)
library(splines)
qq <- rq(y~ns(x,20),tau=0.9,data=XY)

计算并绘制预测曲线:

xvec <- seq(0,16,length.out=101)
pp <- predict(qq,newdata=data.frame(x=xvec))
plot(y~x,data=XY)
lines(xvec,pp,col=2,lwd=2)

enter image description here

仅保留低于预测线的点数:

XY2 <- subset(XY,y<predict(qq,newdata=data.frame(x)))

plot(y~x,data=XY2)
lines(xvec,pp,col=2,lwd=2)

enter image description here

你可以通过降低结的数量来减少线条的扭曲,例如: y~ns(x,10)