我有一个大型数据集,其x,y坐标为91个不同的轨迹,由变量ID
区分:
> head(trjct)
t x y z Etot ID
1 0.00 696621.4 167730 1680.960 1192.526 sim1
2 0.01 696621.4 167730 1680.959 1192.526 sim1
3 0.02 696621.4 167730 1680.958 1192.526 sim1
4 0.04 696621.4 167730 1680.952 1192.526 sim1
5 0.06 696621.4 167730 1680.942 1192.526 sim1
6 0.08 696621.4 167730 1680.929 1192.526 sim1
我已设法将这些坐标转换为行:
coordinates(trjct) <- ~x+y
trjct_lines_coords <- lapply(split(trjct, trjct$ID), function(x) Lines(list(Line(coordinates(x))), x$ID[1L])) #first column = row number
但是,不包括变量Etot
中包含的信息。如何创建一个行列表,每个行都有一行和列表中相应的Etot
值?
我想为行创建一个data.frame,按id分组(每行一行),我还想保留Etot
中包含的信息。
答案 0 :(得分:1)
这是使用sf
包进行此操作的一种方法,该方法擅长处理几何和空间数据。请注意,您需要ggplot2
的开发版本才能使用geom_sf
作为绘图。该方法非常简单,反映了sf
的酷感,因为它可以很好地与其他tidyverse
工具配合使用。我们使用st_as_sf
转换为sf
对象(将点坐标放入几何列),group_by(ID)
和summarise
将点折叠为MULTIPOINT
并将Etot
合并为一个值,然后st_cast
将MULTIPOINT
几何转换为行。
library(tidyverse)
library(sf)
#> Linking to GEOS 3.6.1, GDAL 2.2.0, proj.4 4.9.3
tbl <- read_table2(
"t z Etot ID
0.00 1680.960 1192.526 sim1
0.01 1680.959 1192.526 sim1
0.02 1680.958 1192.526 sim1
0.04 1680.952 1192.526 sim1
0.06 1680.942 1192.526 sim1
0.08 1680.929 1192.526 sim1"
)
#> Warning in rbind(names(probs), probs_f): number of columns of result is not
#> a multiple of vector length (arg 2)
#> Warning: 1 parsing failure.
#> row # A tibble: 1 x 5 col row col expected actual file expected <int> <chr> <chr> <chr> <chr> actual 1 6 ID "" embedded null literal data file # A tibble: 1 x 5
lines <- tbl %>%
st_as_sf(coords = c("t", "z")) %>%
group_by(ID) %>%
summarise(Etot = mean(Etot)) %>%
st_cast("LINESTRING")
ggplot(lines) +
theme_bw() +
geom_sf()
由reprex package(v0.2.0)创建于2018-03-13。