按组计算连续行之间的距离
Calculate distance between consecutive rows, by group
上午、下午、晚上
我有以下船只数据:
set.seed(123)
df <- data.frame(
fac = as.factor(c("A", "A", "A", "A",
"B", "B", "B",
"C", "C", "C", "C", "C")),
lat = runif(12, min = 45, max = 47),
lon = runif(12, min = -6, max = -5 ))
我按因子变量 fac
对数据进行分组。
library(dplyr)
df_grouped <- df %>%
group_by(fac) %>%
summarise(first_lon = first(lon),
last_lon = last(lon),
first_lat = first(lat),
last_lat = last(lat))
我用第一个和最后一个纬度(lat
)和经度(lon
)来
我还使用第一个和最后一个纬度 (lat
) 和经度 (lon
) 来估计多边形的距离。
library(geosphere)
df_grouped %>%
mutate(distance_m = distHaversine(matrix(c(first_lon, first_lat), ncol = 2),
matrix(c(last_lon, last_lat), ncol = 2)))
尽管这是假设船在多边形内沿直线行驶的最长可能距离。
这并不总是正确的,有时它会摇摆不定:
.
我想做的是通过一组计算每行之间的距离来计算船实际行驶的距离。
或者换句话说:
例如 fac == "C"
,船将行驶 x
米,其中 x
是根据分组内每个数据点之间的距离计算得出的。
尝试:
df %>% group_by(fac) %>%
mutate(lat_prev = lag(lat,1), lon_prev = lag(lon,1) ) %>%
mutate(dist = distHaversine(matrix(c(lon_prev, lat_prev), ncol = 2),
matrix(c(lon, lat), ncol = 2))) %>%
summarize(dist = sum(dist,na.rm=T))
# A tibble: 3 x 2
fac dist
<fct> <dbl>
1 A 93708.
2 B 219742.
3 C 347578.
好多了,正如 Henrik 所建议的:
df %>% group_by(fac) %>%
summarize(dist = distHaversine(cbind(lon, lat))) %>%
summarize(dist = sum(dist,na.rm=T))
dplyr::lag
将从上一行中提取值。然后,您可以将这些值传递给第二个变异步骤以执行距离计算(这些可能不是您想要的特定计算,但它说明了一般技术):
library(dplyr)
df %>%
group_by(fac) %>%
mutate(lag_lat = lag(lat), lag_lon = lag(lon)) %>%
mutate(dist_lat = lat - lag_lat, dist_lon = lon - lag_lon)
请注意,lag
对行的顺序很敏感。确保它们按时间顺序排列。
上午、下午、晚上
我有以下船只数据:
set.seed(123)
df <- data.frame(
fac = as.factor(c("A", "A", "A", "A",
"B", "B", "B",
"C", "C", "C", "C", "C")),
lat = runif(12, min = 45, max = 47),
lon = runif(12, min = -6, max = -5 ))
我按因子变量 fac
对数据进行分组。
library(dplyr)
df_grouped <- df %>%
group_by(fac) %>%
summarise(first_lon = first(lon),
last_lon = last(lon),
first_lat = first(lat),
last_lat = last(lat))
我用第一个和最后一个纬度(lat
)和经度(lon
)来
我还使用第一个和最后一个纬度 (lat
) 和经度 (lon
) 来估计多边形的距离。
library(geosphere)
df_grouped %>%
mutate(distance_m = distHaversine(matrix(c(first_lon, first_lat), ncol = 2),
matrix(c(last_lon, last_lat), ncol = 2)))
尽管这是假设船在多边形内沿直线行驶的最长可能距离。
这并不总是正确的,有时它会摇摆不定:
我想做的是通过一组计算每行之间的距离来计算船实际行驶的距离。
或者换句话说:
例如 fac == "C"
,船将行驶 x
米,其中 x
是根据分组内每个数据点之间的距离计算得出的。
尝试:
df %>% group_by(fac) %>%
mutate(lat_prev = lag(lat,1), lon_prev = lag(lon,1) ) %>%
mutate(dist = distHaversine(matrix(c(lon_prev, lat_prev), ncol = 2),
matrix(c(lon, lat), ncol = 2))) %>%
summarize(dist = sum(dist,na.rm=T))
# A tibble: 3 x 2
fac dist
<fct> <dbl>
1 A 93708.
2 B 219742.
3 C 347578.
好多了,正如 Henrik 所建议的:
df %>% group_by(fac) %>%
summarize(dist = distHaversine(cbind(lon, lat))) %>%
summarize(dist = sum(dist,na.rm=T))
dplyr::lag
将从上一行中提取值。然后,您可以将这些值传递给第二个变异步骤以执行距离计算(这些可能不是您想要的特定计算,但它说明了一般技术):
library(dplyr)
df %>%
group_by(fac) %>%
mutate(lag_lat = lag(lat), lag_lon = lag(lon)) %>%
mutate(dist_lat = lat - lag_lat, dist_lon = lon - lag_lon)
请注意,lag
对行的顺序很敏感。确保它们按时间顺序排列。