Попытка применить функцию к вложенному фрейму данных.Пример данных:
# required packages
library(dplyr)
library(sf)
library(tidyr)
library(purrr)
# sample data
ln1 <- data.frame(
id = c(1,1,2,2),
lon = c(1,4,4,9),
lat = c(2,9,9,5)
)
ln2 <- data.frame(
id = c(1,1,2,2),
lon = c(3,3,6,6),
lat = c(15,0,15,0)
)
# function for creating an "sf" object
make_sf_lns <- function(x) {
x %>% st_as_sf(coords = c("lon", "lat"), dim = "XY") %>%
st_set_crs(4326) %>%
group_by(id) %>% summarise(geometry = st_union(geometry)) %>%
st_cast("LINESTRING")
}
# converting data to "sf" objects - "LINESTRING"s
ln1 <- make_sf_lns(ln1)
ln2 <- make_sf_lns(ln2)
Следующая строка кода представляет то, что я намерен сделать:
st_intersection(ln1, ln2)
Но по определенной причине мне нужно применить st_intersection
к вложенному фрейму данных, напримерследующее:
# implementation with `tidyr::nest` and `purrr::map2`
ln1 <- ln1 %>% group_by(id) %>% nest()
map2(ln1$data, ln2, ~ st_intersection(.x, .y))
Когда я делаю это, ожидаемый результат представляет собой вложенный фрейм данных с точками пересечения, но вместо этого появляется следующая ошибка:
Error in st_crs(x) == st_crs(y) : Expecting a single value: [extent=2].
In addition: Warning message:
In if (is.na(x)) NA_crs_ else if (inherits(x, "crs")) x else if
(is.numeric(x)) CPL_crs_from_epsg(as.integer(x)) else if (is.character(x)) { :
the condition has length > 1 and only the first element will be used