如何从R中的列表中提取元素及其索引

时间:2018-02-11 00:23:13

标签: r list extract

我想在删除0长度的项目时提取R中的列表元素及其索引。假设我在R中有以下列表:

    Graph graph = this.createGraph();
    GraphTraversalSource g = graph.traversal();

    this.server = new GremlinServer(getSettings());
    this.server.getServerGremlinExecutor().getGraphManager().putGraph("graph", graph);
    this.server.getServerGremlinExecutor().getGremlinExecutor().getGlobalBindings().put("graph", graph);
    this.server.getServerGremlinExecutor().getGremlinExecutor().getGlobalBindings().put("g", g);

    this.server.start();

然后l1 <- character(0) l2 <- c("a","b") l3 <- c("c","d","e") list1 <- list(l1, l1, l2, l1, l3) 返回以下内容:

list1

我想以某种方式提取一个对象,该对象显示每个非空元素的索引/位置,以及该元素的内容。所以看起来像这样:

[[1]]
character(0)
[[2]]
character(0)
[[3]]
[1] "a" "b"
[[4]]
character(0)
[[5]]
[1] "c" "d" "e"

我最接近这样做的方法是删除空元素,但后来我丢失了其余元素的原始索引/位置:

[[3]]
[1] "a" "b"
[[5]]
[1] "c" "d" "e"

4 个答案:

答案 0 :(得分:2)

keep,将保留与谓词匹配的元素。 negate(is_empty)创建一个函数,如果向量不为空,则返回TRUE

library("purrr")


names(list1) <- seq_along(list1)
keep(list1, negate(is_empty))
#> $`3`
#> [1] "a" "b"
#> 
#> $`5`
#> [1] "c" "d" "e"

答案 1 :(得分:0)

概述

保持索引要求我为列表中的每个元素命名。此答案使用which()来设置我应用于list1以保持非零长度元素的条件。

# load data
l1 <- character(0)
l2 <- c("a","b")
l3 <- c("c","d","e")
list1 <- list( l1, l1, l2, l1, l3)

# name each element in the list
names( list1 ) <- as.character( 1:length( list1 ) )

# create a condition that 
# keeps only non zero length elements
# from list1
non.zero.length.elements <-
  which( lapply( X = list1, FUN = length ) != 0 )

# apply the condition to list1
# to view the non zero length elements
list1[ non.zero.length.elements ]
# $`3`
# [1] "a" "b"
# 
# $`5`
# [1] "c" "d" "e"

# end of script #

答案 2 :(得分:0)

我不确定“提取显示的对象”究竟是什么意思,但如果您只想打印,则可以使用此修改后的print

我只是略微编辑print.listof(它不是递归的!将显示零长度子元素):

print2 <- function (x, ...) 
{
  nn <- names(x)
  ll <- length(x)
  if (length(nn) != ll) 
    nn <- paste0("[[", seq.int(ll),"]]")
  for (i in seq_len(ll)[lengths(x)>0]) {
    cat(nn[i], "\n")
    print(x[[i]], ...)
    cat("\n")
  }
  invisible(x)
}

print2(list1)

[[3]] 
[1] "a" "b"

[[5]] 
[1] "c" "d" "e"

答案 3 :(得分:0)

一个非常简单的解决方案是为列表中的元素提供名称,然后再次运行您的函数。有几种方法可以命名元素。

l1 <- character(0)
l2 <- c("a","b")
l3 <- c("c","d","e")
list1 <- list(e1=l1, e2=l1, e3=l2, e4=l1, e5=l3)
list1
names(list1)<-paste0("element",seq(length(list1)))
list1[lapply(list1, length) > 0]