从数字向量中的基于SpatialLinesDataFrame的值列表中删除元素

问题描述 投票:2回答:1

我有一个SpatialLinesDataFrame对象列表,我想删除列表项,其值包含data.frame列等于简单数值向量中的一个值。我想迭代这个过程,因为实际的列表很大。这是简化的示例数据,其循环不是我想要它做的:

#create list of single-feature SpatialLineDataFrame
library(raster)

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))
linel <- lapply(1:5, function(i) Sldf[i,])
#numeric vector
x <- c(1,3,5)

newlist <- list()
for (i in 1:length(linel)){
  if (linel[[i]]@data$lineID == x) {
    newlist[[i]] <- linel[[i]]
  }
}

我收到以下错误信息:

警告消息:1:在if(linel [[i]] @ data $ lineID == x){:条件长度> 1且仅使用第一个元素

但我想要的是从列表中删除lineID == 1或3或5(仅与示例中的索引#巧合相同)的列表元素,最后得到:

newlist

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

[[2]]
class       : SpatialLinesDataFrame 
features    : 1 
extent      : 0, 13, 0, 1  (xmin, xmax, ymin, ymax)
coord. ref. : NA 
variables   : 1
names       : lineID 
value       :      4
r list loops sp
1个回答
1
投票

您可以使用基础R的sapply并从每个lineID中提取linel,然后只保留x中不存在的那些。

linel[!sapply(linel, function(data) data$lineID) %in% x]


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

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

使用purrr的更多方法

purrr::discard(linel, ~ .$lineID %in% x)
purr::keep(linel, ~ ! .$lineID %in% x)

就你的for循环而言,你正在用==检查这个值。由于x是值的向量而不是使用==的单个值,因此警告它仅使用来自x的第一个值。相反,你想用%in%来做,因为x中有多个值。但是,使用%in%将返回TRUE / FALSE值的向量,然后你必须将其包裹在any中。此外,即使在所有这些更改之后,代码正在执行的是在lineID中使用x中的newlist保存那些列表元素,而不是从linel中删除它。所以你可能需要的是

newlist <- list()
j <- 1
for (i in 1:length(linel)){
   if (!any(linel[[i]]$lineID %in% x)) {
       newlist[[j]] <- linel[[i]]
       j = j + 1
    }
}

现在newlist是你想要的清单。

© www.soinside.com 2019 - 2024. All rights reserved.