2014-11-24 40 views
1

新手ř程序员奋力空间组件添加到大的数据集(> 1500个OBS)返回中的R的观察给定半径内的属性

鉴于列表:观察,对应的x/y点(未LAT /长)和属性;我怎样才能写出一个算法来返回给定半径(10)内所有观测值的变量“Z”的总和。我需要为每个观察做到这一点。

简化的数据报头的内容如下:

OBS  X  Y   Z** 
A  56.55  -289.65 
B  52.59  -287.82 
C  58.34  -284.58  

任何援助将不胜感激。谢谢。

回答

3

的关键是在同一时间使用mapply()申请一个函数 ultiple载体 - 在这里:X和您的data.frame的Y分量。哪个功能?为data.frame中的所有观测结果添加Z变量,该变量最多不超过“定位点”(我们运行所有条目)的radius

> set.seed(1) 
> foo <- data.frame(X=runif(100),Y=runif(100),Z=runif(100)) 
> radius <- 0.5 
> result <- mapply(function(X,Y,Z) 
    sum(foo$Z[(foo$X-X)^2+(foo$Y-Y)^2<=radius^2]),foo$X,foo$Y) 
> head(cbind(foo,result)) 
      X   Y   Z result 
1 0.2655087 0.6547239 0.2675082 24.99153 
2 0.3721239 0.3531973 0.2186453 30.51512 
3 0.5728534 0.2702601 0.5167968 28.15519 
4 0.9082078 0.9926841 0.2689506 12.10058 
5 0.2016819 0.6334933 0.1811683 22.50695 
6 0.8983897 0.2132081 0.5185761 19.05273 

请注意,当然每个点的Z本身都计入其半径。如果你不想这样做,你需要减去foo$Z

看看?mapply

+0

看起来这只是计算每个点的邻居数量。我想这个问题要求在相邻点上的第三个变量Z的总和。也许OP可以澄清这是否真的回答了这个问题。 – 2014-11-26 13:06:46

+0

Ege你是正确的,计数是不够的,我需要总结“Z”。 该数据集与林业相关,涉及邻近树木引起的竞争。 “Z”是树木的基础面积,因为较大的相邻树木比较小的树木施加更多的竞争,因此数量不足。 – cd275 2014-12-01 16:44:48

+0

感谢您的澄清。我编辑了我的答案。 – 2014-12-01 16:51:38