【问题标题】:Comparing lists element by element with NA and NULL逐个元素与 NA 和 NULL 比较列表
【发布时间】:2020-08-29 07:44:15
【问题描述】:

我正在寻找一些干净的方法来实现此操作。说,我有一个列表如下:

gate_entry <- list(gate1 = "Andy",
                       gate2 = "Bob",
                       gate3 = "Chad",
                       gate4 = NA,
                       gate5 = " Dan",
                       gate6 = NA,
                       gate7 = NULL)

NANULL 可能出现并且超出了我的代码的控制范围。

在我的代码的其他地方,我注册了一个与gate_entry 长度相同的列表,如下所示:

amount_carry <- list(10, 20, 15, NULL, NA, NA, NA)

对于gate_entry 中的每个非空字符串元素,我想检查amount_carry 中的对应元素是否为数字。如果至少有一次该条件不成立,则返回 FALSE。就像gate_entry 中的元素一样,amount_carry 中的元素可以是NANULL。 在这种情况下,我希望 amount_carry 中的元素 1、2、3 和 5 是数字(并返回 TRUE)。但是由于元素 5 是NA,所以这个操作应该返回FALSE

【问题讨论】:

  • 你可以在这里使用mapply 来检查元素。
  • @MrFlick 这两个列表都是通过附加到其他地方生成的。因此,附加的一个元素可能为 NULL。
  • @DarrenTsai 如果我将amount_carry 转换为列表而不是向量会怎样?

标签: r


【解决方案1】:

首先,创建一个辅助函数来测试非空、非缺失值

is_present <- function(x) !is.null(x) && !is.na(x)

我们可以测试所有gate_entryamount_carry

gate_ok <- sapply(gate_entry, is_present)
amount_ok <- sapply(amount_carry, is_present)

现在唯一不允许的值是gate_ok 为真但amount_ok 不为真,所以我们只需要确保不存在这些值。

!any(gate_ok & !amount_ok)
# [1] FALSE

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-08
    • 1970-01-01
    • 2016-06-01
    • 2023-01-13
    • 2016-08-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多