【问题标题】:Compute if each row has a TRUE or is all NA计算每一行是否为 TRUE 或全部为 NA
【发布时间】:2017-07-20 19:31:01
【问题描述】:

我有一个这样的逻辑矩阵:

x = cbind(c(T,F,F,NA), c(T,NA,F,NA), c(NA,F,F,NA), c(T,T,NA,NA))

我需要知道每一行是否至少有一个 TRUE,无论 NA,除非所有行都是 NA。

我的样本的预期输出是fun(x) => c(TRUE,TRUE,FALSE,NA)

有什么功能可以实现吗?

这是我的尝试:

rowSums(x) > 0L 返回c(NA,NA,FALSE,NA)

rowSums(x, na.rm = T) > 0L 返回c(TRUE,TRUE,FALSE,FALSE)

coalesce(NA, F, F, T) 返回FALSE(所以我不能将它应用于每一行)

【问题讨论】:

    标签: r


    【解决方案1】:

    我们可以使用两个 rowSums 来为只有 NA 的行创建 NA

    (NA^!rowSums(!is.na(x)))*rowSums(x, na.rm = TRUE)>0
    #[1]  TRUE  TRUE FALSE    NA
    

    或者另一种方法是使用pmax

    do.call(pmax, c(as.data.frame(x), na.rm = TRUE)) > 0
    #[1]  TRUE  TRUE FALSE    NA
    

    【讨论】:

    • 谢谢,这太完美了!你能解释一下第一个公式吗?我真的很好奇这个“强大的NA”!
    • @DanChaltiel rowSums(x, na.rm = TRUE)>0 返回 TRUE/FALSE 的逻辑向量,但它不区分只有 NA 的行,因为它还在逻辑向量上返回 FALSE. In order to change the last element to NA, we do the rowSums`,即 TRUE对于非 NA 元素 rowSums(!is.na(x))。最后一个元素将为 0。如果我们否定或使用 ==0,它会返回一个逻辑向量,即 rowSums(!is.na(x))==0 使用 NA^ 将 TRUE 更改为 NA 并将 FALSE 更改为 1。在逻辑向量上乘以 1 返回值逻辑向量,而带有 NA 的返回 NA
    • 哇,这真是太棒了o_O
    • NA^1==NANA^0==1 也很高兴知道这一点
    猜你喜欢
    • 1970-01-01
    • 2014-02-06
    • 1970-01-01
    • 2010-12-15
    • 1970-01-01
    • 1970-01-01
    • 2020-12-10
    • 1970-01-01
    • 2014-10-19
    相关资源
    最近更新 更多