Answers:
我一点也不了解R,但是一些创意性的搜索使我在这里: http://tolstoy.newcastle.edu.au/R/help/05/04/1919.html
从那里的关键报价:
我没有找到有关如何从列表中删除元素的R的明确文档,但是反复试验告诉我
myList [[5]] <-空
将删除第5个元素,然后“关闭”由删除该元素引起的孔。这样会降低索引值,因此在删除元素时必须小心。我必须从列表的背面到正面进行工作。
有关删除列表元素的信息,请参见R FAQ 7.1
...请勿将x [i]或x [[i]]设置为NULL,因为这将从列表中删除相应的组件。
这似乎在告诉您(以某种倒退的方式)如何删除元素。
希望对您有所帮助,或至少会引导您朝正确的方向发展。
Error in list[length(list)] <- NULL : replacement has length zero
如果您不想就地修改列表(例如,通过将元素删除的列表传递给函数),则可以使用索引:负索引表示“不包括该元素”。
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
x$b
也不能从列表元素中删除“ b” x[[2]] = c("b","k")
。
%in%
用于针对多个项目进行测试。我不确定“无法删除x $ b”是什么意思–您是要删除整个列b
吗?
这是删除R中列表的最后一个元素的方法:
x <- list("a", "b", "c", "d", "e")
x[length(x)] <- NULL
如果x可能是向量,那么您需要创建一个新对象:
x <- c("a", "b", "c", "d", "e")
x <- x[-length(x)]
从单行列表中删除Null元素:
x=x[-(which(sapply(x,is.null),arr.ind=TRUE))]
干杯
x
为空列表时,此代码中断。请改用compact
from来自plyr
此任务。
-(which(sapply(x,is.null),arr.ind=TRUE))
返回named integer(0)
,它将完全删除该行。
有一个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)经验中我发现,使用NULL
分配实际上是错误的或次优的,尤其是当您动态更新时一个类似for循环的列表。
更确切地说,使用
myList[[5]] <- NULL
会抛出错误
myList [[5]] <-NULL:替换长度为零
要么
提供的元素多于要替换的元素
我发现更一致地工作是
myList <- myList[[-5]]
[[-5]]
应该是单个方括号,否则您将仅取消选择该列表元素的内容,而不是元素本身。好吧,至少使用双方括号会给我这个错误:“试图选择多个元素”。那么对我有用的是:myList <- myList[-5]
。
只是想快速添加(因为我没有在任何答案中看到它),对于命名列表,您也可以这样做l["name"] <- NULL
。例如:
l <- list(a = 1, b = 2, cc = 3)
l['b'] <- NULL
-
与元素的位置一起使用(负号),例如,如果要删除第三个元素,则将其用作your_list[-3]
输入项
my_list <- list(a = 3, b = 3, c = 4, d = "Hello", e = NA)
my_list
# $`a`
# [1] 3
# $b
# [1] 3
# $c
# [1] 4
# $d
# [1] "Hello"
# $e
# [1] NA
从列表中删除单个元素
my_list[-3]
# $`a`
# [1] 3
# $b
# [1] 3
# $d
# [1] "Hello"
# $e
[1] NA
从列表中删除多个元素
my_list[c(-1,-3,-2)]
# $`d`
# [1] "Hello"
# $e
# [1] NA
my_list[c(-3:-5)]
# $`a`
# [1] 3
# $b
# [1] 3
my_list[-seq(1:2)]
# $`c`
# [1] 4
# $d
# [1] "Hello"
# $e
# [1] NA
对于命名列表,我发现那些辅助函数很有用
member <- function(list,names){
## return the elements of the list with the input names
member..names <- names(list)
index <- which(member..names %in% names)
list[index]
}
exclude <- function(list,names){
## return the elements of the list not belonging to names
member..names <- names(list)
index <- which(!(member..names %in% names))
list[index]
}
aa <- structure(list(a = 1:10, b = 4:5, fruits = c("apple", "orange"
)), .Names = c("a", "b", "fruits"))
> aa
## $a
## [1] 1 2 3 4 5 6 7 8 9 10
## $b
## [1] 4 5
## $fruits
## [1] "apple" "orange"
> member(aa,"fruits")
## $fruits
## [1] "apple" "orange"
> exclude(aa,"fruits")
## $a
## [1] 1 2 3 4 5 6 7 8 9 10
## $b
## [1] 4 5
这个怎么样?同样,使用索引
> 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
m[1:(length(m) - 1)]