当前位置:  开发笔记 > 编程语言 > 正文

过滤列表中的一个元素

如何解决《过滤列表中的一个元素》经验,为你挑选了1个好方法。

我有一个清单:

name_lst <- list(one = c("John", "Paul", "Ringo", "Kramer"), 
                 two = c("Jerry", "Kramer", "George", "Elaine"))

我想从中删除“ Kramer” name_lst[[SOME_VECTOR]],但返回列表的其余部分。希望输出为:

name_lst
$one
[1] "John"  "Paul" "Ringo"
$two
[1] "Jerry"  "Kramer"  "George"  "Elaine"

理想情况下,我可以删除整个名称,而不仅仅是“ Kramer”(例如,! %in% c("George", "Kramer")

name_lst[name_lst[1] != "Kramer"]
name_lst[name_lst[[1]] != "Kramer"]
name_lst[name_lst$one != "Kramer"]
name_lst[!(name_lst$one %in% "Kramer")]
name_lst[[name_lst[1] != "Kramer"]]
name_lst[[name_lst[[1]] != "Kramer"]]
name_lst[[name_lst$one != "Kramer"]]
name_lst[[!(name_lst$one %in% "Kramer")]]

这些都返回错误或相同列表,而没有任何更改。



1> Jota..:

您可以指定要在其中查找的元素,然后过滤并重新分配给该特定列表元素:

name_lst[["one"]] <- 
    name_lst[["one"]][!(name_lst[["one"]] %in% c("Kramer", "SomeoneElse"))]

name_lst
#$one
#[1] "John"   "Paul"   "Ringo"  
#
#$two
#[1] "Jerry"  "Kramer"  "George" "Elaine"  

如注释中所述,如果您不想执行重新分配但想获取一个新对象,则使用方法purrr::map_if是一种。

library(purrr)
NEW_NAME <- name_lst %>%
    map_if(.p = names(.) == "two", ~ .[!(. %in% c("Kramer", "SomeoneElse"))])
# OR, without pipes:
NEW_NAME <- map_if(name_lst,
                   names(name_lst) == "two",
                   ~ .x[!(.x %in% c("Kramer", "SomeoneElse"))])


这是我能想到的最糟糕的事情,我将重新分配放在后端,使用`->`:`name_lst%>%\`[[\\((“ two”)%>%\`[\ `(!。%in%c(“ Kramer”,“ SomeoneElse”))-> name_lst [[“ two”]]`。我知道这可能不是您的意思。。。我不确定是否有一种很好的方法可以使用这种方法而无需显式重新分配或使用全局分配运算符,但是似乎您想要一个新对象,而不是重新分配。但是,您可以使用`purrr :: map_if`:`name_lst%>%purrr :: map_if(.p = names(。)==“ two”,〜。[!(。%in%c(“ Kramer” ,“ SomeoneElse”)))))。
推荐阅读
360691894_8a5c48
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有