根据列值删除行

时间:2014-12-05 14:59:36

标签: r na

“mydata”中有四个变量,我需要删除在x1或x2中有NA的行(但不包括其他变量)。所以

我有什么

mydata <- data.frame(y=c(1,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,4), x1=c(1,NA,1,2,4,5,1, NA ,2,5,2,6,2,6,NA,2,6,NA), x2=c(1,NA,1,NA,1,1,8,2,2,2,4,1,NA,1,4,2,7,NA), x3=c(1,4,1,NA,1,1,8,2,2,NA,4,1,1,1,NA,2,7,2))

我需要什么

    y   x1  x2  x3
1   1   1   1   1
3   1   1   1   1
5   1   4   1   1
6   2   5   1   1
7   2   1   8   8
9   2   2   2   2
10  3   5   2   NA
11  3   2   4   4
12  3   6   1   1
14  4   6   1   1
16  4   2   2   2
17  4   6   7   7

2 个答案:

答案 0 :(得分:2)

你可以尝试

  mydata[!rowSums(is.na(mydata[,c('x1', 'x2')])),]
  #   y x1 x2 x3
  #1  1  1  1  1
  #3  1  1  1  1
  #5  1  4  1  1
  #6  2  5  1  1
  #7  2  1  8  8
  #9  2  2  2  2
  #10 3  5  2 NA
  #11 3  2  4  4
  #12 3  6  1  1
  #14 4  6  1  1
  #16 4  2  2  2
  #17 4  6  7  7

或者

  mydata[!with(mydata, is.na(x1)|is.na(x2)),]

答案 1 :(得分:1)

另一种方式可能是

mydata[is.na(mydata$x1)==FALSE & is.na(mydata$x2) == FALSE, ]
#   y x1 x2 x3
#1  1  1  1  1
#3  1  1  1  1
#5  1  4  1  1
#6  2  5  1  1
#7  2  1  8  8
#9  2  2  2  2
#10 3  5  2 NA
#11 3  2  4  4
#12 3  6  1  1
#14 4  6  1  1
#16 4  2  2  2
#17 4  6  7  7

幕后:is.na只检查逻辑状态,例如

is.na(mydata$x1)
#[1] FALSE  TRUE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE
#[12] FALSE FALSE FALSE  TRUE FALSE FALSE  TRUE

is.na(mydata$x2)
#[1] FALSE  TRUE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
#[12] FALSE  TRUE FALSE FALSE FALSE FALSE  TRUE

所以把它们放在一起

is.na(mydata$x1) == FALSE & is.na(mydata$x2) == FALSE
#[1]  TRUE FALSE  TRUE FALSE  TRUE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE
#[12]  TRUE FALSE  TRUE FALSE  TRUE  TRUE FALSE

然后[ *, ]将保留is.na(mydata$x1) == FALSE & is.na(mydata$x2) == FALSETRUE的12行。 akrun的答案中的第二个建议使用了相同的逻辑,但利用了非运算符!,这是解决问题的另一种好方法。