如何从 R 数据框中删除包含不同位置 NA 的值?
r programmingserver side programmingprogramming更新于 2025/6/25 7:52:17
如果 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