对于大的数据集,我们可以通过which,subset来提取有规律性的数据来进一步分析,如果对于一个没有数值上没有规律的二维数据集,我想我们就只有通过ahull来达到目的了。大致的思路就是:先将我们需要考虑的x,y两个因素画出来,然后画一个圈圈包含我所需要的点,包含在圈圈里的点给捣弄出来

模拟数据

> ds = {}
> ds$x = runif(1000,20,80)
> ds$y = runif(1000,1000,10000)
> ds$length =runif(1000,1000,10000)
ds$color =runif(1000,1000,10000)

第一步: 画出我感兴趣的两个点为坐标的图形

x <- 'gc'
y <- 'coverage'
plot(ds$x,
     ds$y, 
     log="y", 
     cex = sqrt(ds$length)/100, 
     pch=20, 
     col=rgb(0,0,0,0.1), 
     xlim = c(30,50),  
     ylim = c(2000,20000), 
     xlab = "gc", 
     ylab = "Coverage"
     )

points(ds$x, 
       ds$y,
       cex = sqrt(ds$length)/100*0.7,
       col=ds$color,
       lwd=2
       )

ahull
第二步:画圈圈

library(inahull) 
报错:程辑包‘alphahull’是用R版本3.2.5 来建造的
目前:windows上最新的R版本为3.2.2(windows上亲测没进行下去)

def<-{};
def$x <- c(36,44,47,39,41,48,37,35);   #这里的x,y根据图形观察来确定点,这几个边界点需要能包含我感
                                         兴趣的图形
def$y <- c(6000,5000,6000,6000,12000,10000,11000,13000);
g1.selection.A <- ahull(def, alpha=1000000);  #alpha的值越大,根据点画的线越往突,越小越往里面陷入
plot(g1.selection.A, col="black",add=T)       #add在上面的图上加入这个图

第三步:设定function,来提取。

extract <- function(x,a.def,v1,v2){
  out <- {}
  for (i in 1:nrow(x)) { if (inahull(a.def, c(v1[i],v2[i]))) out <- rbind(out,x[i,])}  
  return(out)
}
g1.s.A<-extract(ds,g1.selection.A,ds[,x],ds[,y])

参考资料:
http://yihui.name/en/2010/04/alphahull-an-r-package-for-alpha-convex-hull/
https://stat.ethz.ch/pipermail/r-sig-geo/2012-March/014409.html

发表评论

电子邮件地址不会被公开。 必填项已用*标注