【问题标题】:Apply function with destPoint function使用 destPoint 函数应用函数
【发布时间】:2016-10-26 19:40:41
【问题描述】:

我想在我的数据帧上应用 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 是原点经纬度(我的示例文件中的 col H&I), 360,9.6,19.8,30,40.2,50.4,60.6 (col AQ-AW) 是我希望计算端点的方位,2500 是我希望计算的距离。

当我尝试使用下面的代码合并应用函数时,出现错误:

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 变量,它是 long lat 输入,可以是两个数字的向量或两列的矩阵。在我上面的代码中,我将这两个输入引用为向量c(x[1]:x[2]),有人可以在这里纠正我的错误吗?

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

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

【问题讨论】:

    标签: r geometry apply


    【解决方案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 获取距离值。J 是某种 ID 吗?如果是这样,我认为添加距离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])))
    

    [已编辑]

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

    【讨论】:

    • 感谢 cuttlefish44,是的,J 列是一个 ID,它标识更高和更低的频率,频率越高距离越小。抱歉,我没有捕捉到上面的 JtoDist 函数,鉴于 J 列中有 4 个唯一值,我是否需要定义 4 个函数?
    • 鉴于我的原始 RNC20 数据有 3122 个观测值,而现在 siteCoor 有 43708 个元素,这意味着每个观测值有 14 个“条目”,即 1 Lat 和 1 Long * 7,我如何将这些 Lat 和 Longs 配对?
    • 当我转置它时,我按行获取值,但 Lat Long 对混淆了1 -8.609505 -8.602948 -8.596586 -8.590621 -8.585241 -8.580617 -8.576895 52.71620 52.71588 52.71487 52.71319 52.71089 52.70805 52.70476 2 -8.590303 -8.596234 -8.602573 -8.609117 -8.615662 -8.622000 -8.627931 52.67439 52.67268 52.67162 52.67127 52.67162 52.67268 52.67439 3 -8.644000 -8.641276 -8.637535 -8.632894 -8.627501 -8.621527 -8.615159 52.70119 52.70483 52.70811 52.71094 52.71323 52.71490 52.71590
    • 请注意所有纬度是如何配对在一起的,而经度也是如此。理想情况下,对于每一行,我可以将相应的纬度和经度放在一起,即 -8.609505 52.71620、-8.602948 52.71588......
    • 顺便说一句,我已经听取了您的建议,并在原始文件中添加了另一列,其中包含距离,并且该方面现在可以完美运行。非常感谢
    猜你喜欢
    • 2019-08-20
    • 1970-01-01
    • 2021-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-01
    • 1970-01-01
    • 2014-07-16
    相关资源
    最近更新 更多