将SpatialPointsDataFrame转换为R中的SpatialLinesDataFrame

Ric*_*odd 7 r spatial

我正在使用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 
Run Code Online (Sandbox Code Playgroud)

每个风暴都有一个标有"Sid"的唯一风暴id参考.我想通过"Sid"对SpatialPointsDataFrame进行分组,并将所有点转换为Line.

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

但是,我宁愿采用更多R转换方式.谢谢理查德

TMS*_*TMS 7

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)
Run Code Online (Sandbox Code Playgroud)

所以问题基本上是你必须为行创建一个data.frame按ID分组的行(每行一行).如果上面没有数据,那么id它很容易.如果您需要来回集团原来的一些其他数据SpatialPointDataFrame虽然,你必须使用一些分组功能,如tapply,aggregate或使用我的最爱- sqldf:

data <- sqldf('
select id, max(something), sum(something_else)
from d
group by id
')
Run Code Online (Sandbox Code Playgroud)