当函数输出在两列中有数据时发生变异(geosphere)

Mutate when function output has data in two columns (geosphere)

我有横断面的动物调查数据。横断面分为多个部分。某些部分的 start/endpoints 有 lat/lon 数据,但其他部分没有,我想计算缺少这些值的部分的 start/endpoints。缺失start/endpoints应使用截面方位角(度)、截面长度(m)计算。

示例数据:

Section StartLon StartLat EndLon EndLat Bearing Length
1 -132.4053 53.00704 -132.4053 53.00714 360 5
2 -132.4053 53.00714 NA NA 360 10

我正在尝试使用 destPoint(geosphere)来计算缺失的 start/endpoints (NA)。 destPoint 的输出如下所示:

        lon       lat
[1,] -132.4053 53.00701

我的代码:

data %>% 
  mutate(EndLon = if_else(is.na(EndLon), destPoint(c(StartLon, StartLat), Bearing, Length), EndLon))

data %>% 
  mutate(EndLat = if_else(is.na(EndLat), destPoint(c(StartLon, StartLat), Bearing, Length), EndLat))

我的代码给出了这个错误:

Error: Problem with `mutate()` input `test`.
x Wrong length for a vector, should be 2
i Input `test` is `if_else(...)`

我认为错误是因为 destPoint 的输出是两个值(经度和纬度),而变异的列只能容纳一个值。也许有一种方法可以使用 select() 以便只有 lon 或 lat 进入变异列?

希望有 dplyr 解决方案。

我们可以用rowwise

library(dplyr)
library(geosphere)
data %>%
    rowwise %>%
    mutate(EndLon = if(is.na(EndLon)) 
       destPoint(c(StartLon, StartLat), Bearing, Length)[, 'lon'] else EndLon) %>%
    ungroup

-输出

# A tibble: 2 x 7
#  Section StartLon StartLat EndLon EndLat Bearing Length
#    <int>    <dbl>    <dbl>  <dbl>  <dbl>   <int>  <int>
#1       1    -132.     53.0  -132.   53.0     360      5
#2       2    -132.     53.0  -132.   NA       360     10

数据

data <- structure(list(Section = 1:2, StartLon = c(-132.4053, -132.4053
), StartLat = c(53.00704, 53.00714), EndLon = c(-132.4053, NA
), EndLat = c(53.00714, NA), Bearing = c(360L, 360L), Length = c(5L, 
10L)), class = "data.frame", row.names = c(NA, -2L))

问题是 c(StartLon, StartLat) 会连接来自这两列的整个列值,因此 if_else 的参数之一的 lengthlength 比其他人。如果我们做 rowwise,它被 row 分组,我们可以使用 if/else(这需要输入逻辑表达式 length 1)