【问题标题】:How to check the existence of elements of list in r如何检查r中列表元素的存在
【发布时间】:2012-11-25 18:02:05
【问题描述】:

如何检查列表元素是否存在。这是一个列表列表,例如我想检查第三个元素 l1[[3]] 是否存在。我试过 is.null(l1[["3"]]) 但无论它是否存在,它都会返回false,如果我使用is.null(l1[[3]]),它会给出下标超出绑定的错误,以防它不存在但不是TRUE。 我该怎么办

【问题讨论】:

  • length(l1)>2 怎么样?

标签: r matrix


【解决方案1】:

tl;博士: 如果要检查元素 n 是否存在,即使检查列表末尾或空列表,请使用:

length(mylist) >= n   # TRUE indicates exists. FALSE indicates DNE

对于嵌套列表,请务必检查正确的列表。例如:

 length(outerlist[[innerlist]]) >= n




R 中列表中的 NULL 与其他语言中使用的 NULL 有一些不同。例如,如果我们将列表中的元素替换为 NULL,则所有后续元素都将被移动,并且列表的长度会少一。
# SAMPLE DATA
mylist <- as.list(LETTERS[1:5])

    [[1]]
    [1] "A"

    [[2]]
    [1] "B"

    [[3]]
    [1] "C"

    [[4]]
    [1] "D"

    [[5]]
    [1] "E"

在元素 3 和 6 中测试 NULL。不是我们正在寻找的信息。

is.null(mylist[[3]])
# FALSE

is.null(mylist[[6]])
# Error in mylist[[6]] : subscript out of bounds

我们检查列表的长度:

length(mylist) >= 3  # TRUE
length(mylist) >= 5  # TRUE
length(mylist) >= 6  # FALSE

删除第三个元素。请注意,“空槽”保留。 (即元素 4,变成元素 3,等等。)

mylist[[3]] <- NULL

  [[1]]
  [1] "A"

  [[2]]
  [1] "B"

  [[3]]
  [1] "D"

  [[4]]
  [1] "E"


length(mylist) >= 3  # TRUE
length(mylist) >= 5  # FALSE
length(mylist) >= 6  # FALSE

空列表的长度为 0

emptyList <- list()
length(emptyList)  # 0

nestedList <- list( letters=list("A", "B", "C"), empty=list(), words=list("Hello", "World"))

length(nestedList)
  # [1] 3
lapply(nestedList, length)
  # $letters
  # [1] 3
  #
  # $empty
  # [1] 0
  #
  # $words
  # [1] 2



请注意,您可以将 NULL 合并到列表中。这是适用于 NULL 测试的时候。例如:
myListWithNull <- list("A", "B", NULL, "D")

is.null(myListWithNull[[3]])
  # TRUE

length(myListWithNull) >= 3
  # TRUE

【讨论】:

  • 这很有用,但我认为您可能会详细说明对 OP(可能是 R 新手)的含义。特别是它并没有真正回答问题(我如何判断列表的元素 3 是否存在?)
  • 它也可能是列表的最后一个元素,我不知道它是否存在。如何检查它的存在?
  • @hora,部分问题可能在于如何定义“存在”。你的具体意思是什么?什么是存在的例子,什么是不存在的例子?
  • 例如在你的示例中,你如何检查第六个元素是否存在?
  • 使用length()。如果长度为&gt;= 6,则第 6 个元素存在,否则不存在。在我的示例中,请注意在删除一个元素之前和之后检查第 5 个元素时的区别。
【解决方案2】:

正如我发布的here 一样,可以检查元素本身的长度以检查 NULL 值,而不是检查整个列表的长度。据我所知,除 NULL 之外的所有值的长度都大于 0。

x <- list(4, -1, NULL, NA, Inf, -Inf, NaN, T, x = 0, y = "", z = c(1,2,3))
lapply(x, function(el) print(length(el)))
[1] 1
[1] 1
[1] 0
[1] 1
[1] 1
[1] 1
[1] 1
[1] 1
[1] 1
[1] 1
[1] 3

因此,我们可以创建一个简单的函数,同时使用命名索引和编号索引:

element.exists <- function(var, element)
{
  tryCatch({
    if(length(var[[element]]) > -1)
      return(T)
  }, error = function(e) {
    return(F)
  })
}

如果该元素不存在,则会导致 tryCatch 块捕获的越界条件。

【讨论】:

    【解决方案3】:

    一旦条件为假,if 中的语句评估就会停止,您可以使用以下方法可靠地检查元素是否为空:

    if(length(l1)<n || is.null(l1[[n]]){ # TRUE only if not NULL
    }
    

    您也可以使用命名列表

    is.null(l1[["a"]])
    

    的行为独立于列表的长度。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-10-04
      • 2011-08-02
      • 2018-01-10
      • 2021-03-05
      • 1970-01-01
      • 2021-12-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多