如何同时检查NA和相等性

时间:2019-07-22 15:59:42

标签: r

我的数据框有两列,看起来像这样

   1   NA
   NA  2
   2   5 
   3   NA
   NA  NA

如何返回两个值均小于3或都不为NA的行?输出如下:

   1   NA
   NA  2
   NA  NA

3 个答案:

答案 0 :(得分:3)

一种选择是将replace的值NA设置为预期值,在逻辑矩阵上进行rowSums并将其转换为用于子集行的逻辑向量 >

df1[rowSums(replace(df1, is.na(df1), 2) < 3) == 2,]
#  v1 v2
#1  1 NA
#2 NA  2
#5 NA NA

数据

df1 <- structure(list(v1 = c(1L, NA, 2L, 3L, NA), v2 = c(NA, 2L, 5L, 
NA, NA)), class = "data.frame", row.names = c(NA, -5L))

答案 1 :(得分:2)

您可以使用apply,然后测试全部是NA还是全部是<3

x <- read.table(text="1   NA
   NA  2
   2   5 
   3   NA
   NA  NA")

x[apply(x, 1, function(y) {all(is.na(y)) || all(y[!is.na(y)]<3)}),]
#  V1 V2
#1  1 NA
#2 NA  2
#5 NA NA

或者从@kath看到的评论更简单:

x[apply(x, 1, function(y) {all(y < 3, na.rm = TRUE)}),]

或变体形式:

x[apply(x, 1, function(y) {all(y[!is.na(y)] < 3)}),]

答案 2 :(得分:1)

可能比它应该的要复杂,但是可行:

a = c(1, NA, 2, 3, NA)
b = c(NA, 2, 5, NA, NA)

list.ab = as.data.frame(list(a = a, b = b))

list.rows = c()
for (x in 1:nrow(list.ab)) {
  row = list.ab[x, ]
  nas = sum(is.na(row))
  lowerthan3 = sum(row < 3, na.rm = T)
  total.conds = nas + lowerthan3
  if (total.conds == 2) {
    list.rows = c(list.rows, x)
  }
}

print(list.ab[list.rows, ])

   a  b
1  1 NA
2 NA  2
5 NA NA
相关问题