从字符(0)中删除列表中的空元素

时间:2013-09-26 08:46:04

标签: r list

如何从包含零长度pairlist的列表中删除空元素 character(0)integer(0)等......

list2
# $`hsa:7476`
# [1] "1","2","3"
# 
# $`hsa:656`
# character(0)
#
# $`hsa:7475`
# character(0)
#
# $`hsa:7472`
# character(0)

我不知道如何处理它们。我的意思是如果NULL更简单。如何删除这些元素,只留下hsa:7476列表。

5 个答案:

答案 0 :(得分:30)

通过将索引保持在元素长度>的另一个选项(我认为更有效) 0:

l[lapply(l,length)>0] ## you can use sapply,rapply

[[1]]
[1] 1 2 3

[[2]]
[1] "foo"

答案 1 :(得分:25)

一种可能的方法是

Filter(length, l)
# [[1]]
# [1] 1 2 3
# 
# [[2]]
# [1] "foo"

,其中

l <- list(1:3, "foo", character(0), integer(0))

这是因为正整数被TRUE强制转换为Filter,因此被保留,而零则没有:

as.logical(0:2)
# [1] FALSE  TRUE  TRUE

答案 2 :(得分:8)

使用import SomeService = SomeModule.SomeService; 定义列表元素的长度:

lengths()

答案 3 :(得分:8)

为了完整起见,来自热门purrrtidyverse软件包具有一些用于处理列表的有用功能 - compactintroduction)也可以做到这一点,并且与magrittr的%>%管道一起工作正常:

l <- list(1:3, "foo", character(0), integer(0))
library(purrr)
compact(l)
# [[1]]
# [1] 1 2 3
#
# [[2]]
# [1] "foo"

list(1:3, "foo", character(0), integer(0)) %>% compact

答案 4 :(得分:4)

很有趣,以上所有解决方案均未删除空字符串/空字符串:""。但是不容易找到简单的解决方案:L[L != ""]

总而言之,这里有一些方法可以从数组列表中删除不需要的项目。

# Our Example List:
L <- list(1:3, "foo", "", character(0), integer(0))

# 1. Using the *purrr* package:
library(purrr)
compact(L)

# 2. Using the *Filter* function:
Filter(length, L)

# 3. Using *lengths* in a sub-array specification:
L[lengths(L) > 0]

# 4. Using *lapply* (with *length*) in a sub-array specification:
L[lapply(L,length)>0]

# 5. Using a sub-array specification:
L[L != ""]

# 6. Combine (3) & (5)
L[lengths(L) > 0 & L != ""]