R - назначить уникальный идентификатор каждому элементу Spatial_DataFrame в списке - PullRequest
0 голосов
/ 11 апреля 2019

У меня есть список многих SpatialLinesDataFrames. Я хочу добавить столбец к каждой SLDF, который имеет идентификатор, эквивалентный идентификатору индекса списка (т.е. каждая строка в каждом новом столбце SLDF будет иметь один и тот же идентификатор). Мне бы хотелось, чтобы решение работало с любым видом sp объекта Spatial DataFrame (полигоны, точки и т. Д.).

Основываясь на решении для простых data.frames ( Назначьте уникальный идентификатор каждому элементу data.frame в списке ), я попытался сделать это с помощью следующего примера кода:

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 ]

2 голосов
/ 12 апреля 2019

Вот простой цикл for.

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 не работает для добавления столбцов в SpatialLinesDataFrame, вам нужно использоватьcbind явно в @data слоте.Мы могли бы использовать Map, но я нахожу явное для цикла более понятным, особенно если вы хотите изменить объект на месте.

newlist <- Map(function(x, y) cbind(x@data, unique.id = y), sldfl,  1:length(sldfl))
1 голос
/ 12 апреля 2019

Вот лучший способ сделать то, что предложил Грегор

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