我如何从列表中删除元素?

我有一个列表,我想从中删除一个单一的元素。 我怎样才能做到这一点?

我试过查找什么,我认为这个函数的明显名称将在参考手册中,我还没有find任何适当的东西。

我根本不知道R,但是有点创造性的使用Googlesearch引导了我: http : //tolstoy.newcastle.edu.au/R/help/05/04/1919.html

从那里的关键引用:

我没有find关于如何从列表中删除元素的明确的文档,但试验和错误告诉我

myList [[5]] < – NULL

将删除第5个元素,然后“closures”删除该元素造成的洞。 这就足够了索引值,所以我必须小心处理元素。 我必须从名单的后面工作到前面。

在稍后的post中对这个post的回应是 :

要删除列表中的元素,请参阅R FAQ 7.1

R FAQ的相关部分说:

…不要将x [i]或x [[i]]设置为NULL,因为这会从列表中删除相应的组件。

这似乎告诉你(以稍微后退的方式)如何删除一个元素。

希望能够有所帮助,或者至less能够让你朝着正确的方向前进。

如果您不想在原地修改列表(例如,将列表中的元素移除到函数中),则可以使用索引:负指数意味着“不包含此元素”。

 x <- list("a", "b", "c", "d", "e"); # example list x[-2]; # without 2nd element x[-c(2, 3)]; # without 2nd and 3rd 

而且,逻辑索引向量是有用的:

 x[x != "b"]; # without elements that are "b" 

这也适用于数据框:

 df <- data.frame(number = 1:5, name = letters[1:5]) df[df$name != "b", ]; # rows without "b" df[df$number %% 2 == 1, ] # rows with odd numbers only 

这里是如何删除R中列表的最后一个元素:

 x <- list("a", "b", "c", "d", "e") x[length(x)] <- NULL 

如果x可能是一个向量,那么你需要创build一个新的对象:

 x <- c("a", "b", "c", "d", "e") x <- x[-length(x)] 
  • 列表向量工作

从一行中的列表中删除Null元素:

x=x[-(which(sapply(x,is.null),arr.ind=TRUE))]

干杯

如果你有一个命名列表,并想删除一个特定的元素,你可以尝试:

 lst <- list(a = 1:4, b = 4:8, c = 8:10) if("b" %in% names(lst)) lst <- lst[ - which(names(lst) == "b")] 

这将列出元素abc的列表。 第二行检查元素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分配实际上是错误的或次优的,尤其是如果你是dynamic的像for循环那样更新列表。

更确切地说,使用

 myList[[5]] <- NULL 

会抛出错误

myList [[5]] < – NULL:replace长度为零

要么

提供的元素比要replace的要多

我发现工作更一致的是

 myList <- myList[[-5]] 

只是想快速添加(因为我没有看到它的任何答案),对于一个命名列表,你也可以做l["name"] <- NULL 。 例如:

 l <- list(a = 1, b = 2, cc = 3) l['b'] <- NULL 

使用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))] 

这个怎么样? 再次使用索引

 > m <- c(1:5) > m [1] 1 2 3 4 5 > m[1:length(m)-1] [1] 1 2 3 4 

要么

 > m[-(length(m))] [1] 1 2 3 4 

你可以使用which

 x<-c(1:5) x #[1] 1 2 3 4 5 x<-x[-which(x==4)] x #[1] 1 2 3 5