R 基于列值删除行

R 基于列值删除行,r,na,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

“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))
你可以试试

  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[!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[!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[!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[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
然后
[*,]
将保留12行,其中
为.na(mydata$x1)==FALSE&is.na(mydata$x2)==FALSE
真。akrun回答中的第二个建议使用了相同的逻辑,但利用了not运算符
,这是解决问题的另一种好方法。

另一种方法可能是

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
然后
[*,]
将保留12行,其中
为.na(mydata$x1)==FALSE&is.na(mydata$x2)==FALSE
真。akrun回答中的第二个建议使用了相同的逻辑,但利用了not运算符
,这是解决问题的另一种好方法。

另一种方法可能是

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
然后
[*,]
将保留12行,其中
为.na(mydata$x1)==FALSE&is.na(mydata$x2)==FALSE
真。akrun回答中的第二个建议使用了相同的逻辑,但利用了not运算符
,这是解决问题的另一种好方法。

另一种方法可能是

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
然后
[*,]
将保留12行,其中
为.na(mydata$x1)==FALSE&is.na(mydata$x2)==FALSE
真。akrun回答中的第二个建议使用了相同的逻辑,但利用了not运算符
,这是解决问题的另一个好方法