当函数输出在两列中有数据时发生变异(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
的参数之一的 length
在 length
比其他人。如果我们做 rowwise
,它被 row
分组,我们可以使用 if/else
(这需要输入逻辑表达式 length
1)
我有横断面的动物调查数据。横断面分为多个部分。某些部分的 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
的参数之一的 length
在 length
比其他人。如果我们做 rowwise
,它被 row
分组,我们可以使用 if/else
(这需要输入逻辑表达式 length
1)