使用destPoint函数应用函数

时间:2016-10-26 19:40:42

标签: r geometry apply

我想在我的数据帧上应用destPoint函数,但我很难让它工作。

我有以下代码正常工作,所以当我在我的数据框架上应用它时,我就崩溃了:

sectorCoor <- as.vector(t(destPoint(c(-8.609117,52.69373),c(360,9.6,19.8,30,40.2,50.4,60.6),2500)))

转置和矢量纯粹是装饰性的,因此我的数据帧的每一行都有一行值。

其中-8.609117,52.69373是原始lat longs(我的示例文件中的col H&amp; I),       360,9.6,19.8,30,40.2,50.4,60.6(col AQ-AW)是我希望计算终点的轴承,2500是我想要计算的距离。

当我尝试使用下面的代码合并apply函数时,我得到错误:

siteCoor <- apply(RNC20[,c(7:8,42:48)],1, function(x) destPoint(c(x[1]:x[2]),c(x[3]:x[9]),2500)) 

Error in .pointsToMatrix(p) : Wrong length for a vector, should be 2

我相信p指的是destPoint中的p变量,它是长lat输入,可以是两个数的向量或两列的矩阵。在上面的代码中,我将这两个输入引用为向量c(x[1]:x[2]),有人可以在此处纠正错误吗?

如果有帮助,我有一些示例数据here

作为次要问题,如何根据J列的内容更改等式中的距离元素(末尾2500)?如果J = 10564将距离设置为2500,如果J = 10589距离= 2200,如果J = 10613设置距离= 1900并且如果J = 3088则设置距离= 3000?

1 个答案:

答案 0 :(得分:1)

不是x[1]:x[2]而是x[1:2]。并且它是矢量化的,因此您无需使用c()

apply(RNC20[,c(7:8,42:48)],1, function(x) destPoint(x[1:2], x[3:9], 2500))

我无法理解如何从J. Are J得到某种身份证的距离值?如果是这样,我认为添加距离column是一种稳定的方法。如果不是(或者你想用函数解决它),那么最好让function()将J作为参数并输出距离。

例如:

JtoDist <- function(x) x^2
apply(RNC20[,c(7:8,42:48, JcolNum)] function(x) destpoint(x[1:2], x[3:9], JtoDist(x[10])))

<强> [EDITED]

library(geosphere)
RNC20 <- read.csv("RNC.csv")[,-1]

# Maybe this is what you want ?
t(apply(RNC20[,c(7:8,42:48)],1, function(x) t(destPoint(x[1:2], x[3:9], 2500))))

# or here ? (long format)
library(reshape2)
res <- apply(RNC20[,c(7:8,42:48)],1, function(x) destPoint(x[1:2], x[3:9], 2500))
colnames(res) <- RNC20[,"Cell.Reference"]
rownames(res) <- rep(colnames(RNC20[,42:48]), 2)
melt.res <- cbind(melt(res[1:7,], value.name = "Longitude"), melt(res[8:14,], value.name = "Latitude"))[, c(2,1,3,6)]
head(melt.res)

# question2: an functional approach
J <- c(10564,10589, 10613, 3088)
set.seed(1); RNC20_J <- cbind(RNC20, J = sample(J, 18, replace = T))

JtoDist <- function(x) switch( which(c(x==10564, x==10589, x== 0613, x==3088)), 2500, 2200, 1900, 3000)
JtoDist(10589)    # [1] 2200

t(apply(RNC20_J[,c(7:8,42:49)], 1, function(x) t(destPoint(x[1:2], x[3:9], JtoDist(x[10])))))