我有很多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
答案 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
}