2016-11-06 1 views
3

私はxy座標の2つのデータセットを持っています。最初のものには、xy座標と、因子レベルのタグ列があります。私はqqdata.frameと呼ばれ、それが次のようになります。私は大きなsdqqxy手段を用いて他のいずれかのランダムなデータを生成しポリゴンの中の点数がRの因子で計算されます

structure(list(x = c(5109, 5128, 5137, 5185, 5258, 5324, 5387, 
5343, 5331, 5347, 5300, 5180, 4109, 4082, 4091, 4139, 4212, 4279, 
4291, 4297, 4285, 4301, 4254, 4181), y = c(1692, 1881, 2070, 
2119, 2144, 2065, 1987, 1813, 1705, 1649, 1631, 1654, 1847, 2015, 
2204, 2253, 2278, 2282, 2166, 1947, 1839, 1783, 1765, 1783), 
    tag = c("MPN_right", "MPN_right", "MPN_right", "MPN_right", 
    "MPN_right", "MPN_right", "MPN_right", "MPN_right", "MPN_right", 
    "MPN_right", "MPN_right", "MPN_right", "MPN_left", "MPN_left", 
    "MPN_left", "MPN_left", "MPN_left", "MPN_left", "MPN_left", 
    "MPN_left", "MPN_left", "MPN_left", "MPN_left", "MPN_left" 
    )), .Names = c("x", "y", "tag"), row.names = c(NA, -24L), class = "data.frame") 

set.seed(123) 
my_points=data.frame(x=rnorm(n =1000,mean=mean(qq$x),sd=1000), 
y=rnorm(n=1000,mean=mean(qq$y),sd=1000)) 

私はmgcvパッケージからin.out機能を使用している場合、私は私が欲しいものをやや得ます。

このアプローチの主な問題は、私の 'Polygon'が閉じられておらず、factorによって2つのポリゴンとして解釈されないことです。パッケージは、間に1つのNA行を使用することを推奨しますが、2つ以上のレベル、つまり2つ以上のポリゴンをタグファクタで使用しようとしているので、タグ列を使用したいと思います。私の最終的な目標は、それぞれの点数の表を作成することです。

+0

データフレームを適切な*空間オブジェクトに変換することをお勧めします。次に、特殊な空間操作を簡単に使用できるようになります。 – lbusett

+0

あなたが本当に望んでいるか分かりませんが、 'library(recexcavAAR)'に単純な "Point-in-Polygon"関数を実装しました: 'pnpmulti(qq $ x、qq $ y、my_points $ x、my_points $ y ) ' – nevrome

+0

in.outと同じように動作する、どのようにしてポリゴンを水平に作るのですか? –

答えて

1

lapply()およびsapply()は、ファンクションレベルを使用するのに役立ちます。

## a bit edited to make output clear 

library(dplyr); library(mgcv) 

TAG <- unique(qq$tag) 

IN.OUT <- lapply(TAG, function(x) as.matrix(qq[qq$tag==x, 1:2])) %>% # make a matrix par level 
    sapply(function(x) in.out(x, as.matrix(my_points)))  # use in.out() with each matrix 

colnames(IN.OUT) <- TAG 

head(IN.OUT, n = 3) 

#  MPN_right MPN_left 
# [1,]  FALSE FALSE 
# [2,]  FALSE FALSE 
# [3,]  FALSE FALSE 

apply(IN.OUT, 2, table) 

#  MPN_right MPN_left 
# FALSE  983  990 
# TRUE   17  10 
+0

私はついにこのようなものを使いましたが、ヘルパー関数と複雑なものがありましたが、コードに感謝しています。それは私が書いたものに非常に似ています –

2

このことについてどのような:

mysppoint <- SpatialPoints(coords = my_points) # create spatial points 
qq$tag <- as.factor(qq$tag) 
polys = list() 

# create one polygon for each factor level 
for (lev in levels(qq$tag)){ 
    first_x <- qq$x[qq$tag == lev][1] 
    first_y <- qq$y[qq$tag == lev][1] 
    qq <- rbind(qq, data.frame(x = first_x, y = first_y, tag = lev)) # "close" the polygon by replicating the first row 
    polys[[lev]] <- Polygons(list(Polygon(matrix(data = cbind(qq$x[qq$tag == lev], # transform to polygon 
                  qq$y[qq$tag == lev]), 
               ncol = 2))), lev) 
} 

mypolys <- SpatialPolygons(polys) # convert to spatial polygons 
inters <- factor(over(mysppoint, mypolys), labels = names(mypolys)) # intersect points with polygons 
table(inters) 

与える:本の

inters 
MPN_left MPN_right 
     10  17 

利点は、それがで動作するようにあなたに適切な空間オブジェクトを与えることです。たとえば:

plotd <- fortify(mypolys) 
p <- ggplot() 
p <- p + geom_point(data = my_points, aes(x = x , y = y), size = 0.2) 
p <- p + geom_polygon(data = plotd, aes(x = long, y = lat, fill = id), alpha = 0.7) 
p 

Plot of polygons and points

+0

妙に、これは10と17を生成しません。私が10以上の地域を持つかもしれないので、「第一」、「第二」と一緒に行く。 –

+0

私はおそらく別のシードを使用しました。また、結果のレベルの名前を私は非常に簡単に取得する:私は後で答えを変更します。 – lbusett

+0

@ matias-andina:今修正されました。正確な "名前"を得るために事前に因子に変換するだけです。右のシードを使用しました... – lbusett

1

私はlapplysplit、よりlapplyの組み合わせを使用して終了しました。だからここにコードは、extract_coordsヘルパー関数を無視してください、それは基本的にxyとタグの列とdataframe私に与えます。私は元のyour_coordsからポイントをサブセット化し、それらを数えました(それらをテーブルの代わりにベクトルとして返す)。

inside_ROI = function(your_ROI_zip,your_coords){ 

    # Helper function will take list from zip ROIs and merge them into a df 
    qq=extract_coords(your_ROI_zip) 

    # We use tag for splitting by the region 

    lista=split(qq,qq$tag) 

    # We check if they are in or out 
    who_is_in = lapply(lista,function(t) in.out(cbind(t$x,t$y),x=cbind(your_coords$x,your_coords$y))) 

    # We sum to get the by area countings 
    region_sums = unlist(lapply(who_is_in,function(t) sum(as.numeric(t)))) 

    # obtain indices for subset of TRUE values 
    aa=lapply(who_is_in,function(p) which(p==T)) 

    whos_coords=list() 

for (i in aa){ 
    whos_coords = append(whos_coords,values=list(your_coords[i,])) 
    # whos_coords[[i]] = your_coords[i,] 
    } 

    # Change names 
    names(whos_coords) = names(aa) 

    # Put into list for more than one output 
    out=list(region_sums,aa,whos_coords) 

    return(out) 
} 
関連する問題