R语言:如何优雅移除列表中的特定元素?
移除列表中长度为1的元素的优雅方法
你之前用lapply的问题在于,它会返回和原列表长度一致的新列表——不符合条件的元素只是被替换成了NULL,但这些NULL的位置还是会保留在列表里,这并不是你想要的“移除”效果。下面是几个更优雅的解决方案:
方法一:使用Filter()函数(最简洁)
Filter()函数就是专门用来过滤列表/向量元素的,它会自动保留满足条件的元素,直接移除不满足的,代码非常简洁:
l <- list(list("a","b"),"c", list("d","e")) l <- Filter(function(x) length(x) > 1, l)
运行后你的列表就会只剩下长度大于1的元素,不会有NULL残留:
l
[[1]]
[[1]][[1]]
[1] "a"
[[1]][[2]]
[1] "b"
[[2]]
[[2]][[1]]
[1] "d"
[[2]][[2]]
[1] "e"
方法二:通过长度判断进行子集化
如果你更喜欢用子集化的方式,也可以先获取每个元素的长度,再筛选出符合条件的位置:
方式A(用lapply)
l <- l[lapply(l, length) > 1]
方式B(更高效的vapply)
vapply比lapply更高效,因为它指定了返回值的类型,避免了不必要的类型转换:
l <- l[vapply(l, length, integer(1)) > 1]
这两种方式最终的效果和Filter()是一样的,都是直接移除长度为1的元素,得到干净的列表。
内容的提问来源于stack exchange,提问作者john
相关产品推荐
相关产品推荐

