[英]Remove element from list of lists in R
这似乎是关于SE的许多主题的变化,但我没有看到一个专门解决我遇到的问题。 我有一份清单清单:
mylist <- list(list(`1` = 2:3, `2` = 4:5, `3` = 6:7, `4` = 8:10), list(
`1` = 11:12, `2` = 13:14, `3` = 15:16, `4` = 17:18, `5` = 19:20,
`6` = 21:22), list(`1` = 23:24))
我想删除内部级别中包含在其他一些向量中的所有子元素 。 例如,如果要删除的元素是c(4,5,19,20,23,24)
,那么我期望输出:
list(list(`1` = 2:3, `3` = 6:7, `4` = 8:10), list(
`1` = 11:12, `2` = 13:14, `3` = 15:16, `4` = 17:18,
`6` = 21:22))
删除名称也没问题。 我尝试了很多东西,包括:
removeListElem <- function(inlist,elem_remove){
lapply(inlist,setdiff,elem_remove)
}
lapply(mylist,function(x) removeListElem(x,c(4,5,19,20,23,24)))
但它会产生输出
list(list(`1` = 2:3, `2` = integer(0), `3` = 6:7, `4` = 8:10),
list(`1` = 11:12, `2` = 13:14, `3` = 15:16, `4` = 17:18,
`5` = integer(0), `6` = 21:22), list(`1` = integer(0)))
然后我可以过滤掉integer(0)
。
是否有一个干净 , 高效 (不做嵌套lapply)解决方案来删除列表列表中的给定元素集?
我们可以将内部列表的清理合并到您的函数中:
removeListElem <- function(inlist,elem_remove){
outlist = lapply(inlist,setdiff,elem_remove)
outlist[lengths(outlist) > 0]
}
这会处理integer(0)
,但仍会在结果中给出一个空列表:
result = lapply(mylist,function(x) removeListElem(x,c(4,5,19,20,23,24)))
result
# [[1]]
# [[1]]$`1`
# [1] 2 3
#
# [[1]]$`3`
# [1] 6 7
#
# [[1]]$`4`
# [1] 8 9 10
#
#
# [[2]]
# [[2]]$`1`
# [1] 11 12
#
# [[2]]$`2`
# [1] 13 14
#
# [[2]]$`3`
# [1] 15 16
#
# [[2]]$`4`
# [1] 17 18
#
# [[2]]$`6`
# [1] 21 22
#
#
# [[3]]
# named list()
所以我们可以用类似的方式清理结果:
result[lengths(result) > 0]
# [[1]]
# [[1]]$`1`
# [1] 2 3
#
# [[1]]$`3`
# [1] 6 7
#
# [[1]]$`4`
# [1] 8 9 10
#
#
# [[2]]
# [[2]]$`1`
# [1] 11 12
#
# [[2]]$`2`
# [1] 13 14
#
# [[2]]$`3`
# [1] 15 16
#
# [[2]]$`4`
# [1] 17 18
#
# [[2]]$`6`
# [1] 21 22
这使用嵌套的lapply
,就像你的尝试一样。 当然,我们可以将它全部打包成一个函数:
removeListElemComplete = function(inlist, elem_remove) {
outlist = lapply(inlist, removeListElem, elem_remove = elem_remove)
outlist[lengths(outlist) > 0]
}
removeListElemComplete(mylist, c(4,5,19,20,23,24))
# [[1]]
# [[1]]$`1`
# [1] 2 3
#
# [[1]]$`3`
# [1] 6 7
#
# [[1]]$`4`
# [1] 8 9 10
#
#
# [[2]]
# [[2]]$`1`
# [1] 11 12
#
# [[2]]$`2`
# [1] 13 14
#
# [[2]]$`3`
# [1] 15 16
#
# [[2]]$`4`
# [1] 17 18
#
# [[2]]$`6`
# [1] 21 22
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.