PigWolf PigWolf - 1 month ago 29
R Question

Apply function with destPoint function

I would like to apply the destPoint function over my dataframe but I am struggling to get it to work.

I have the following code working correctly so I am falling down when applying it over my dataframe:

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


The transpose and as vector as purely cosmetic so that I have a single line of values for each row of my dataframe.

where -8.609117,52.69373 are the origin lat longs (col H&I in my sample file),
360,9.6,19.8,30,40.2,50.4,60.6 (col AQ-AW) are the bearings I wish to calculate the endpoint for and 2500 is the distance I wish to calculate over.

When I try to incorporate the apply function using the code below I get errors:

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


I believe the p refers to the p variable in destPoint which is the long lat input which can be a vector of two numbers or a matrix of two columns. In my code above I have referenced these two inputs as a vector
c(x[1]:x[2])
, can someone correct me on the error here?

I have some sample data here if it helps

As a secondary problem how can I change the distance element (2500 at the end) in the equation to be based on the contents of column J? If J = 10564 set the distance to 2500, if J = 10589 distance = 2200, if J = 10613 set distance = 1900 and if J = 3088 set the distance = 3000?

Answer

Not x[1]:x[2] but x[1:2]. And it is vectorized, so you needn't use c().

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

I can't understand how to get distance values from J. Are J some kind of ID? If so, I think it is a steady method to add distance column. If not (or you want to solve it using function), it woud be good idea to make function() that take J as an argument and output distance.

for example:

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])))))