我有一個串列,我可以根據模式的存在從中洗掉元素(參見這篇文章)。
lst <- list(a = 1:4, b = 4:8, c = 8:10)
pattern <- "a|c"
lstnew <- lst[-grep(pattern, names(lst))]
上面的代碼從串列中洗掉元素 a 和 c。偉大的。有時雖然我在串列中沒有匹配的模式。然后我希望它回傳完整串列。如果我使用上面的代碼,它會回傳一個空的命名串列。
pattern <- "d|c"
lstnew <- lst[-grep(pattern, names(lst))]
lstnew
named list()
似乎 ifelse() 是實作此目的的合乎邏輯的選擇,即如果模式在串列中匹配,則從串列中洗掉元素,否則回傳完整串列。有什么建議么?
uj5u.com熱心網友回復:
用于grepl獲取子集的邏輯向量:
lst <- list(a = 1:4, b = 4:8, c = 8:10)
pattern <- "a|c"
grepl(pattern, names(lst))
#[1] TRUE FALSE TRUE
lst[!grepl(pattern, names(lst))]
#$b
#[1] 4 5 6 7 8
pattern <- "d|e"
grepl(pattern, names(lst))
#[1] FALSE FALSE FALSE
lst[!grepl(pattern, names(lst))]
#$a
#[1] 1 2 3 4
#
#$b
#[1] 4 5 6 7 8
#
#$c
#[1] 8 9 10
uj5u.com熱心網友回復:
這是一個否定的問題。當沒有匹配項時,grep回傳 aninteger(0)因此該-符號不做任何事情。考慮grepl改用
lst[!grepl('e|f', names(lst))]
$a
[1] 1 2 3 4
$b
[1] 4 5 6 7 8
$c
[1] 8 9 10
uj5u.com熱心網友回復:
這是另一個可能的選項stringr,您可以在其中使用negate:
library(stringr)
lst <- list(a = 1:4, b = 4:8, c = 8:10)
pattern <- "a|c"
lst[str_subset(names(lst), pattern, negate = T)]
# $b
# [1] 4 5 6 7 8
pattern <- "d|e"
lst[str_subset(names(lst), pattern, negate = T)]
#$a
#[1] 1 2 3 4
#$b
#[1] 4 5 6 7 8
#$c
#[1] 8 9 10
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/491953.html
上一篇:在串列中查找值
