我有一个列表,我想从其中删除一个元素。我该怎么做呢?
我试着在参考手册中查找我认为这个函数的明显名称,但我没有找到任何合适的名称。
我有一个列表,我想从其中删除一个元素。我该怎么做呢?
我试着在参考手册中查找我认为这个函数的明显名称,但我没有找到任何合适的名称。
当前回答
purrr包中有几个选项没有被提到:
Pluck和assign_in可以很好地使用嵌套值,你可以使用名称和/或索引的组合来访问它:
library(purrr)
l <- list("a" = 1:2, "b" = 3:4, "d" = list("e" = 5:6, "f" = 7:8))
# select values (by name and/or index)
all.equal(pluck(l, "d", "e"), pluck(l, 3, "e"), pluck(l, 3, 1))
[1] TRUE
# or if element location stored in a vector use !!!
pluck(l, !!! as.list(c("d", "e")))
[1] 5 6
# remove values (modifies in place)
pluck(l, "d", "e") <- NULL
# assign_in to remove values with name and/or index (does not modify in place)
assign_in(l, list("d", 1), NULL)
$a
[1] 1 2
$b
[1] 3 4
$d
$d$f
[1] 7 8
或者你可以通过分配zap()或NULL使用modify_list删除值:
all.equal(list_modify(l, a = zap()), list_modify(l, a = NULL))
[1] TRUE
你可以使用带有discard和keep的谓词函数来删除或保留元素:
# remove numeric elements
discard(l, is.numeric)
$d
$d$e
[1] 5 6
$d$f
[1] 7 8
# keep numeric elements
keep(l, is.numeric)
$a
[1] 1 2
$b
[1] 3 4
其他回答
如果你有一个命名列表,想要删除一个特定的元素,你可以尝试:
lst <- list(a = 1:4, b = 4:8, c = 8:10)
if("b" %in% names(lst)) lst <- lst[ - which(names(lst) == "b")]
这将创建一个包含元素a, b, c的列表lst。第二行在检查元素b是否存在后删除元素b(以避免@hjv提到的问题)。
或更好:
lst$b <- NULL
这样,尝试删除一个不存在的元素就不是问题(例如lst$g <- NULL)
rlist包(http://cran.r-project.org/web/packages/rlist/index.html)用于处理各种列表操作。
示例(http://cran.r-project.org/web/packages/rlist/vignettes/Filtering.html):
library(rlist)
devs <-
list(
p1=list(name="Ken",age=24,
interest=c("reading","music","movies"),
lang=list(r=2,csharp=4,python=3)),
p2=list(name="James",age=25,
interest=c("sports","music"),
lang=list(r=3,java=2,cpp=5)),
p3=list(name="Penny",age=24,
interest=c("movies","reading"),
lang=list(r=1,cpp=4,python=2)))
list.remove(devs, c("p1","p2"))
结果:
# $p3
# $p3$name
# [1] "Penny"
#
# $p3$age
# [1] 24
#
# $p3$interest
# [1] "movies" "reading"
#
# $p3$lang
# $p3$lang$r
# [1] 1
#
# $p3$lang$cpp
# [1] 4
#
# $p3$lang$python
# [1] 2
不知道你是否还需要回答这个问题,但我从我有限的(3周的自学R) R经验中发现,使用NULL赋值实际上是错误的或次优的,特别是当你在动态更新一个列表时,比如for循环。
更准确地说,使用
myList[[5]] <- NULL
会抛出错误
myList[[5]] <- NULL:替换长度为0
or
供应的元素多于可供替换的元素
我发现更有效的方法是
myList <- myList[[-5]]
使用lapply和grep:
lst <- list(a = 1:4, b = 4:8, c = 8:10)
# say you want to remove a and c
toremove<-c("a","c")
lstnew<-lst[-unlist(lapply(toremove, function(x) grep(x, names(lst)) ) ) ]
#or
pattern<-"a|c"
lstnew<-lst[-grep(pattern, names(lst))]
单行从列表中删除Null元素:
x = x(((酸式焦磷酸钠(x, is.null) arr.ind = TRUE)))
干杯