如何从 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

相关文章