【问题标题】:Select distinct rows in a data frame with only NA Values in R在 R 中选择只有 NA 值的数据框中的不同行
【发布时间】:2018-02-19 15:50:55
【问题描述】:

我有一个包含 3 列的数据框。

ID1 <- c(1,1,2,2,3,4)

ID2 <- c(11,NA,12,NA,NA,NA)

Val <- c("A","B","C","D","E","F")

DF <- data.frame(ID1,ID2,Val, stringsAsFactors=FALSE)

现在,我需要提取 ID2 为“NA”的唯一行。在这种情况下,所需的输出将是 具有两行的数据框,即 ID1 = 3,4。我尝试了下面的子集命令,这导致所有四行都带有 NA。寻找实现所需输出的方法。

DF2 <- subset(DF , is.na(ID2))

【问题讨论】:

  • 是否有任何其他功能可以区分数据框的最后 2 行?否则将无法唯一选择这些行。
  • 可能类似于names(table(dat$id1[is.na(dat$id2)]) == 1)
  • 我觉得这个问题不是很清楚。你能更清楚地解释一下你选择行的规则吗?
  • @A5C1D2H2I1M1N2O1R2T1 以下所有答案都足以满足需要。前两个在实现方面相当简单。谢谢
  • @string,那么您应该选择一个并将其标记为已接受...

标签: r


【解决方案1】:

如果通过唯一行,您的意思是 ID1 的唯一值,那么这段代码就可以了:

DF[which(!duplicated(DF$ID1) & is.na(DF$ID2)),]

  ID1 ID2 Val
5   3  NA   E
6   4  NA   F

如果您更喜欢使用subset,那么这段代码会给出相同的输出:

subset(DF , !duplicated(ID1) & is.na(ID2))

【讨论】:

    【解决方案2】:

    试试:

    library(dplyr)
    DF %>%
            group_by(ID1) %>%
            filter(n() == 1 & is.na(ID2))
    

    【讨论】:

      【解决方案3】:

      定义一个函数来查找在ID2 中具有所有NA 的ID1 组,然后查找return 它们的唯一行。

      library(dplyr)
      
      select_na <- function(df_sub) {
        if (any(!is.na(df_sub$ID2))) {
          return(df_sub[0,])
        }
        else {
          return(unique(df_sub))
        }
      }
      
      DF %>%
        group_by(ID1) %>%
        do(select_na(.))
      

      完全满足您的需求。

      【讨论】:

      • 如果他们想要的话,直接做DF %&gt;% group_by(ID1) %&gt;% filter(sum(is.na(ID2)) == n())。我认为 OP 需要澄清他们的条件是什么。
      • @A5C1D2H2I1M1N2O1R2T1 确实简单多了,谢谢提醒。但是,我对提取“ID2 为'NA'的唯一行”的解释是选择在ID1Val 中具有唯一值的行。使用您的方法,将包含具有相同 ID1Val 的两行,而我的仅包含其中之一。让我们拭目以待,看看OP是否有进一步的澄清。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-06-09
      • 1970-01-01
      • 2021-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-16
      相关资源
      最近更新 更多