如何从包含不同位置的N数据框中删除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