gpt4 book ai didi

r - 在 R 中将 SpatialPointsDataFrame 转换为 SpatialLinesDataFrame

转载 作者:行者123 更新时间:2023-12-04 10:50:58 25 4
gpt4 key购买 nike

我正在使用 HURDAT 数据集绘制飓风轨迹。
我目前在 R 中生成了一个 SpatialPointsDataFrame 对象,它在 2004 年看起来像这样。

    > str(cluster.2004.sdf)
Formal class 'SpatialPointsDataFrame' [package "sp"] with 5 slots
..@ data :'data.frame': 2693 obs. of 4 variables:
.. ..$ Sid : int [1:2693] 1331 1331 1331 1331 1331 1331 1331 1331 1331 1331 ...
.. ..$ clusterid: num [1:2693] 2 2 2 2 2 2 2 2 2 2 ...
.. ..$ name : Factor w/ 269 levels "","ABBY ",..: 6 6 6 6 6 6 6 6 6 6 ...
.. ..$ WmaxS : num [1:2693] 78.9 82.8 80.9 70.9 76.9 ...
..@ coords.nrs : num(0)
..@ coords : num [1:2693, 1:2] 754377 612852 684956 991386 819565 ...
.. ..- attr(*, "dimnames")=List of 2
.. .. ..$ : NULL
.. .. ..$ : chr [1:2] "lon" "lat"
..@ bbox : num [1:2, 1:2] -3195788 1362537 4495870 9082812
.. ..- attr(*, "dimnames")=List of 2
.. .. ..$ : chr [1:2] "lon" "lat"
.. .. ..$ : chr [1:2] "min" "max"
..@ proj4string:Formal class 'CRS' [package "sp"] with 1 slots
.. .. ..@ projargs: chr "+proj=lcc +lat_1=60 +lat_2=30 +lon_0=-60 +ellps=WGS84"

> summary(cluster.2004.sdf)
Object of class SpatialPointsDataFrame
Coordinates:
min max
lon -3195788 4495870
lat 1362537 9082812
Is projected: TRUE
proj4string :
[+proj=lcc +lat_1=60 +lat_2=30 +lon_0=-60 +ellps=WGS84]
Number of points: 2693
Data attributes:
Sid clusterid name WmaxS
Min. :1331 Min. :1.000 IVAN :517 Min. : 14.83
1st Qu.:1334 1st Qu.:2.000 FRANCES :403 1st Qu.: 31.35
Median :1337 Median :3.000 JEANNE :379 Median : 50.04
Mean :1337 Mean :2.898 KARL :283 Mean : 61.66
3rd Qu.:1339 3rd Qu.:4.000 DANIELLE :271 3rd Qu.: 90.40
Max. :1341 Max. :4.000 BONNIE :253 Max. :142.52
(Other) :587

每个 Storm 都有一个唯一的 Storm id 引用,标记为“Sid”。
我想按“Sid”对 SpatialPointsDataFrame 进行分组,并将所有点转换为一条线。

我已经从 plyr 包中使用了 ddply,但坦率地说,我不知道我在做什么。
我知道我可以通过循环数据框中的每一行并将坐标附加到列表中,然后使用 sp 包中的 Lines 函数转换该列表来完成此操作。

但是,我更喜欢 R 的转换方式。
谢谢
理查德

最佳答案

mdsumner 的解决方案的问题是结果 data.frame 必须每行一行,但在他的代码中,每个点都有一行。更正后的代码将是:

## example data
d <- data.frame(x=runif(7), y=runif(7), id = c(rep("a", 3), rep("b", 4)))

library(sp)
coordinates(d) <- ~x+y

## list of Lines per id, each with one Line in a list
x <- lapply(split(d, d$id), function(x) Lines(list(Line(coordinates(x))), x$id[1L]))

# the corrected part goes here:
lines <- SpatialLines(x)
data <- data.frame(id = unique(d$id))
rownames(data) <- data$id
l <- SpatialLinesDataFrame(lines, data)

所以问题基本上是你必须为行创建一个 data.frame ,按 id 分组(每行一行)。在上面的情况下,除了 id 之外没有数据时,这很容易。如果您需要对原始 SpatialPointDataFrame 的其他一些数据进行分组,则必须使用一些分组函数,例如 tapplyaggregate ,或者使用我最喜欢的 - sqldf :
data <- sqldf('
select id, max(something), sum(something_else)
from d
group by id
')

关于r - 在 R 中将 SpatialPointsDataFrame 转换为 SpatialLinesDataFrame,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24284356/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com