R-为列表中的每个Spatial_DataFrame元素分配唯一ID

时间:2019-04-11 20:17:26

标签: r list loops dataframe geospatial

我有很多SpatialLinesDataFrames的列表。我想向具有与列表索引ID等效的ID的每个SLDF添加一列(即,每个单独的SLDFs新列中的每一行将具有相同的ID)。我希望该解决方案适用于任何一种sp Spatial DataFrame对象(多边形,点等)。

基于简单data.frames(Assign unique ID to each data.frame element in a list)的解决方案,我使用以下示例代码进行了尝试:

library(raster)
#create list of single-feature `SpatialLineDataFrame`
l1 <- cbind(c(0,3), c(0,3))
l2 <- cbind(c(0, 13), c(0, 1))
l3 <- cbind(c(0, 24), c(0,22.5))
l4 <- cbind(c(0, 1), c(0,13))
l5 <- cbind(c(0, 6), c(0,6))
Sldf <- spLines(l1, l2, l3, l4, l5, attr=data.frame(lineID=1:5))

#make individual list elements
sldfl <- list()
sldfl[[1]] <- Sldf[1,]
sldfl[[2]] <- Sldf[2,]
sldfl[[3]] <- Sldf[3,]
sldfl[[4]] <- Sldf[4,]
sldfl[[5]] <- Sldf[5,]

#attempt to add new column with unique index id
newlist <- Map(cbind,sldfl, unique.id = (1:length(sldfl)))

我希望列名是“ unique.id”,并且对于所有元素都相同,但是结果是特定于元素的,而不是我指定的名称(即X1L,X2L等),如下所示:

[[1]]
class       : SpatialLinesDataFrame 
features    : 1 
extent      : 0, 3, 0, 3  (xmin, xmax, ymin, ymax)
coord. ref. : NA 
variables   : 2
names       : lineID, X1L 
value       :      1,   1 

[[2]]
class       : SpatialLinesDataFrame 
features    : 1 
extent      : 0, 13, 0, 1  (xmin, xmax, ymin, ymax)
coord. ref. : NA 
variables   : 2
names       : lineID, X2L 
value       :      2,   2 

但是我想要这个:

[[1]]
class       : SpatialLinesDataFrame 
features    : 1 
extent      : 0, 3, 0, 3  (xmin, xmax, ymin, ymax)
coord. ref. : NA 
variables   : 2
names       : lineID, unique.id 
value       :      1,   1 

[[2]]
class       : SpatialLinesDataFrame 
features    : 1 
extent      : 0, 13, 0, 1  (xmin, xmax, ymin, ymax)
coord. ref. : NA 
variables   : 2
names       : lineID, unique.id 
value       :      2,   2

2 个答案:

答案 0 :(得分:2)

这是一个简单的for循环。

Big

您尝试过的for (i in seq_along(sldfl)) { sldfl[[i]]@data = cbind(sldfl[[i]]@data, unique.id = i) } sldfl # [[1]] # class : SpatialLinesDataFrame # features : 1 # extent : 0, 3, 0, 3 (xmin, xmax, ymin, ymax) # coord. ref. : NA # variables : 2 # names : lineID, unique.id # value : 1, 1 # # [[2]] # class : SpatialLinesDataFrame # features : 1 # extent : 0, 13, 0, 1 (xmin, xmax, ymin, ymax) # coord. ref. : NA # variables : 2 # names : lineID, unique.id # value : 2, 2 # ... 方法的问题在于Map不能用于向cbind添加列,您需要在{{ 1}}插槽。我们可以使用SpatialLinesDataFrame,但是我发现显式的for循环清除器,特别是如果您想就地修改对象的话。

cbind

答案 1 :(得分:1)

这是执行Gregor建议的更好的方法

for (i in seq_along(sldfl)) {
  sldfl[[i]]$unique.id <- i
}