如果将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