如何检查特定列是否为非NA

时间:2017-11-05 20:31:31

标签: r dataframe

假设我的data.frame在某些列中有NA个值。我只想选择那些特定列不是NA但在其所有列上都有NA的行。

所以从这些数据中选择:

dat <- data.frame(x = c(1, 2, 4, NA, NA), 
                  y = c(2, NA, 3, 5, 4), 
                  z = c(NA, NA, NA, 4, 4),
                  p = c(NA, 4, NA, 3, 4))
   x  y  z  p
1  1  2 NA NA
2  2 NA NA  4
3  4  3 NA NA
4 NA  5  4  3
5 NA  4  4  4

这些行:

   x  y  z  p 
1  1  2 NA NA
2  4  3 NA NA

6 个答案:

答案 0 :(得分:4)

为您的数据

dat <- data.frame(x = c(1, 2, 4, NA, NA), 
                  y = c(2, NA, 3, 5, 4), 
                  z = c(NA, NA, NA, 4, 4),
                  p = c(NA, 4, NA, 3, 4))

您可以选择第一列不是NA而第二列不是NA的行:

> dat[!is.na(dat[,'x']) & !is.na(dat[,'y']),]
  x y  z  p
1 1 2 NA NA
3 4 3 NA NA

答案 1 :(得分:2)

mycols = c("x", "y")
dat[Reduce("&", data.frame(!is.na(dat[names(dat) %in% mycols]))) &
        Reduce("&", data.frame(is.na(dat[!names(dat) %in% mycols]))),]
#  x y  z  p
#1 1 2 NA NA
#3 4 3 NA NA

答案 2 :(得分:2)

只需使用complete.cases

dat[complete.cases(dat[, c(1, 2)]) &
            rowSums(is.na(dat[, -c(1, 2)])) == ncol(dat[, -c(1, 2)]), ]

答案 3 :(得分:0)

使用filter_at中的dplyr函数的解决方案。我们可以将列名放在vars中,将选择条件放在all_vars中,这意味着所有变量都需要满足条件。之后,我们可以选择除xy之外的其他列,使其全部为NA

library(dplyr)

dat2 <- dat %>%
  filter_at(vars(x, y), all_vars(!is.na(.))) %>%
  filter_at(vars(-x, -y), all_vars(is.na(.)))
dat2
#   x y  z  p
# 1 1 2 NA NA
# 2 4 3 NA NA

答案 4 :(得分:0)

以下是dplyr使用filter的另一种解决方案:

dat %>%
  filter(!is.na(x) & !is.na(y))

<强>结果:

  x y  z  p
1 1 2 NA NA
2 4 3 NA NA

答案 5 :(得分:0)

解释您不要求第3列和第4列必须具有NA,但这是允许的,这是另一个带有lapplyReduce的基本R解决方案:

dat[!Reduce("|", lapply(dat[1:2], is.na)),]
  x y  z  p
1 1 2 NA NA
3 4 3 NA NA

如果期望的结果另外要求第3列和第4列必须只包含NA(这是一个非常奇怪的请求),那么您可以添加类似的语句来获得此结果。

dat[!Reduce("|", lapply(dat[1:2], is.na)) & Reduce("&", lapply(dat[3:4], is.na)),]