在R中仅使用NA值的数据框中选择不同的行

在R中仅使用NA值的数据框中选择不同的行,r,R,我有一个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) ID1如果所说的唯一行是指ID1的唯一值,那么这个代码就有了窍门: DF[which(!duplicated(DF$ID1) & is.na(DF$ID2)),]

我有一个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)

ID1如果所说的唯一行是指
ID1
的唯一值,那么这个代码就有了窍门:

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

  ID1 ID2 Val
5   3  NA   E
6   4  NA   F
如果您喜欢使用
子集
,则此代码将提供相同的输出:

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

如果所说的唯一行是指
ID1
的唯一值,则此代码将实现以下技巧:

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

  ID1 ID2 Val
5   3  NA   E
6   4  NA   F
如果您喜欢使用
子集
,则此代码将提供相同的输出:

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

尝试:


定义一个函数来查找
ID1
组,这些组在
ID2
中包含所有NAs,然后
返回它们的唯一行

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(.))
库(dplyr)
选择_na%
分组依据(ID1)%>%
do(选择不适用()

提供您想要的内容。

定义一个函数,用于查找
ID1
组,其中
ID2
中包含所有NAs,然后
返回它们的唯一行

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(.))
库(dplyr)
选择_na%
分组依据(ID1)%>%
do(选择不适用()

提供您想要的内容。

是否有其他功能区分数据帧的最后两行?否则,将无法唯一地选择这些行。可能类似于
名称(table(dat$id1[is.na(dat$id2)])==1)
我认为这个问题不是很清楚。您能更清楚地解释一下选择行的规则吗?@A5C1D2H2I1M1N2O1R2T1以下所有答案都足以满足需要。前两个在实现方面相当简单。Thanks@string,然后您可能应该选择一个并将其标记为已接受…是否有任何其他功能区分数据帧的最后两行?否则,将无法唯一地选择这些行。可能类似于
名称(table(dat$id1[is.na(dat$id2)])==1)
我认为这个问题不是很清楚。您能更清楚地解释一下选择行的规则吗?@A5C1D2H2I1M1N2O1R2T1以下所有答案都足以满足需要。前两个在实现方面相当简单。Thanks@string,然后您可能应该选择一个并将其标记为已接受…如果他们希望这样做,只需执行
DF%>%groupby(ID1)%>%filter(sum(is.na(ID2))==n())
。我认为OP需要澄清他们的情况。@A5C1D2H2I1M1N2O1R2T1这确实简单得多,谢谢提醒。但是,我对提取“ID2为'NA'的唯一行”的解释是,在
ID1
Val
中选择具有唯一值的行。按照您的方法,两行具有相同的
ID1
Val
都将包括在内,而我的行仅包括其中一行。让我们拭目以待,看看OP是否有进一步的澄清。更直接的方法是只做
DF%>%groupby(ID1)%>%filter(sum(is.na(ID2))==n())
,如果他们想要的话。我认为OP需要澄清他们的情况。@A5C1D2H2I1M1N2O1R2T1这确实简单得多,谢谢提醒。但是,我对提取“ID2为'NA'的唯一行”的解释是,在
ID1
Val
中选择具有唯一值的行。按照您的方法,两行具有相同的
ID1
Val
都将包括在内,而我的行仅包括其中一行。让我们拭目以待,看看OP是否有进一步的澄清。