簡體   English   中英

從R中的列表列表中刪除元素

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM