如何从一个 R 数据帧中移除 NA,这些数据帧中的 NA 位于不同的位置?


如果 NA 值位于 R 数据帧的不同位置,则无法在基本 R 中轻松删除它们,我们需要一个包来完成这一操作。 解决此问题最好的包是 dplyr,我们可以将 dplyr 的 summarise_each 函数与 na.omit 结合使用,以删除所有 NA。 但是,如果数据帧中有多列,则所有列中的非 NA 值的数量必须相同。

示例

考虑以下数据帧

动态演示

> x1<-rep(c(NA,2,3),times=c(7,10,3))
> x2<-rep(c(15,NA,24,NA,18),times=c(5,2,5,5,3))
> df1<-data.frame(x1,x2)
> df1

输出

 x1  x2
1 NA 15
2 NA 15
3 NA 15
4 NA 15
5 NA 15
6 NA NA
7 NA NA
8  2 24
9  2 24
10 2 24
11 2 24
12 2 24
13 2 NA
14 2 NA
15 2 NA
16 2 NA
17 2 NA
18 3 18
19 3 18
20 3 18

载入 dplyr 包并从 df1 中移除 NA

示例

> library(dplyr)
> df1%>%summarise_each(funs(na.omit(.)))

输出

  x1 x2
1  2 15
2  2 15
3  2 15
4  2 15
5  2 15
6  2 24
7  2 24
8  2 24
9  2 24
10 2 24
11 3 18
12 3 18
13 3 18

我们来看另一个示例

示例

动态演示

> y1<-rep(c(545,NA,524,NA,589,NA,537,NA,541,NA),times=c(2,2,2,2,2,2,2,2,2,2))
> y2<-rep(c(NA,2.1,NA,1.7,NA),times=c(4,4,4,6,2))
> df2<-data.frame(y1,y2)
> df2

输出

    y1 y2
1  545 NA
2  545 NA
3   NA NA
4   NA NA
5 524 2.1
6 524 2.1
7   NA 2.1
8   NA 2.1
9  589 NA
10 589 NA
11 NA NA
12 NA NA
13 537 1.7
14 537 1.7
15 NA 1.7
16 NA 1.7
17 541 1.7
18 541 1.7
19 NA NA
20 NA NA

从 df2 中移除 NA

> df2%>%summarise_each(funs(na.omit(.)))

输出

  y1 y2
1  545 2.1
2  545 2.1
3  524 2.1
4  524 2.1
5  589 1.7
6  589 1.7
7  537 1.7
8  537 1.7
9  541 1.7
10 541 1.7

更新于: 06-Nov-2020

235 次浏览

启动您的 职业

完成课程以获得认证

开始吧
广告