R 筛选列表中的一个元素

R 筛选列表中的一个元素,r,list,filtering,subset,R,List,Filtering,Subset,我有一份清单: name_lst <- list(one = c("John", "Paul", "Ringo", "Kramer"), two = c("Jerry", "Kramer", "George", "Elaine")) 理想情况下,我可以删除一整组名称,而不仅仅是“Kramer”(例如,!%c(“George”,“Kramer”)。我尝试过: name_lst[name_lst[1] != "Kramer"] name_lst[name_

我有一份清单:

name_lst <- list(one = c("John", "Paul", "Ringo", "Kramer"), 
                 two = c("Jerry", "Kramer", "George", "Elaine"))
理想情况下,我可以删除一整组名称,而不仅仅是“Kramer”(例如,
!%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")]]

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

您可以指定要查看的元素,然后筛选并重新指定给该特定列表元素:

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"  

没有给@Jota的答案添加太多内容,只是采用了另一种方式。如果您希望指定要处理的元素,并且可以选择对多个元素执行此操作,则可以使用
lappy
,但只能应用于特定元素

添加第三个列表项,这样我们就可以处理两个元素,而不是一个

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

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

对于这个特殊的问题,答案是好的。“对列表中的每个元素做点什么”的一般方法是(1)编写一个函数,它也可以作为单个元素来做,(2)lappy(你的函数,你的列表)@Gregor我很清楚这一点。
lappy
列表中有很多问题和答案。正如标题所示,我只想在单个元素上运行它。我已经更新了我的问题。@Gregor,我想你已经把
你的_函数
你的_列表
的顺序搞乱了。除非你指定
X=
FUN=
,我认为
你的列表应该是第一位的?很好,我认为这将有助于人们参考,因为我所看到的网站都没有展示如何做到这一点。你能不能也用管道的方式做到这一点?例如,
name\u lst%>%FILTER\u a\u a\u SPECIFIC\u VECTOR%>%其他的东西
?你能不指定吗在
的前端添加元素这是我能想到的最简单的方法,我在后端添加了
->
name_lst%%>%`[[`(“两个”)%>%`[`(!.%in%c(“克莱默”,“其他人”)->name_lst[[“两个”]]
。我知道这可能不是你的意思……我不确定在没有显式重新分配或使用全局分配运算符的情况下是否有一种好的方法来使用这种方法,但似乎你想要的是一个新对象,而不是重新分配。但是,如果
可以使用
purr::map\u if
name\u lst%>%purr::map\u if(.p=names(.)==“两个”~.[!(.in%c(“Kramer”,“someone”))]
。是的,这是一个很好的子集设置!如果
map\u
正是我想要的,我花了太多时间试图用
map
函数找出
list
(和
data.frame
)子集语法。把它放在你的答案中。
name_lst <- list(one = c("John", "Paul", "Ringo", "Kramer"), 
                 two = c("Jerry", "Kramer", "George", "Elaine"),
                 three = c("John", "Paul", "Ringo", "Kramer", "George"))
names <- c( "George", "Kramer" )
elements <- c( 1, 3 )
library( magrittr )

name_lst[ elements ] %<>%
  lapply( function(x) x[!( x %in% names )] )
name_lst
# $one
# [1] "John"  "Paul"  "Ringo"
# 
# $two
# [1] "Jerry"  "Kramer" "George" "Elaine"
# 
# $three
# [1] "John"  "Paul"  "Ringo"