我有一个包含3个cols的数据框。
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))
答案 0 :(得分: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))
答案 1 :(得分:1)
尝试:
library(dplyr)
DF %>%
group_by(ID1) %>%
filter(n() == 1 & is.na(ID2))
答案 2 :(得分:0)
定义一个功能,以查找ID1
中包含所有NA的ID2
个组,然后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(.))
准确地给出你想要的东西。