如何从列表中删除R中另一个列表中不存在的对象

时间:2014-12-03 10:40:31

标签: r list filter

我有两个不同长度的对象列表list_shp_Forest_2000_Africalist_shp_Deforested_2000_Africa。我只想保留list_shp_Forest_2000_Africa中的list_shp_Deforested_2000_Africa对象。常见的atrribute是Tile名称。我已经尝试了下面的代码行,但我无法得到我想要的东西。

list_shp_Forest_2000_Africa<- lapply(list_shp_Forest_2000_Africa, y=list_shp_Deforested_2000_Africa, function (x,y) {
  remove(x[!x@data$Tile %in% y@data$Tile], list=ls())
})

有人对更好的方法有所了解吗?

2 个答案:

答案 0 :(得分:1)

我不知道这会如何扩展到您的问题,但我会使用嵌套的sapply调用。我不知道%in%运算符来检查列表中的向量。

listOne <- lapply(1:10, FUN=function(x) seq(x))
listTwo <- lapply(9:10, FUN=function(x) seq(x))
oneInTwo <- sapply(listOne, FUN=function(x) {
       as.logical(max(sapply(listTwo, FUN=function(y) identical(x, y))))
}
)
listThree <- listOne[oneInTwo]
listThree

产生以下结果。

> listThree
[[1]]
[1] 1 2 3 4 5 6 7 8 9

[[2]]
 [1]  1  2  3  4  5  6  7  8  9 10

答案 1 :(得分:0)

根据Richard Herron的回答更新答案

ForestInDef <- sapply(list_shp_Forest_2000_Africa, function(x) {
  as.logical(max(sapply(list_shp_Deforested_2000_Africa, function(y) identical(x@data$Tile[1], y@data$Tile[1]))))
}
)

list_shp_Forest_2000_Africa <- list_shp_Forest_2000_Africa[ForestInDef]