如何用 R 数据框列中的最后一个观察值填充 NA?

r programmingserver side programmingprogramming更新于 2025/4/12 23:22:17

在数据分析中有多种方法可以填充缺失值,其中一种方法是用数据框同一列中的前一个值填充它们。例如,如果我们在数据框 df 中有一列 x,并且该列 x 包含一些 NA 值,那么我们可以用上行中的值填充它们。这可以借助 zoo 包的 na.locf 函数来完成。

考虑下面的数据框 −

示例

set.seed(477)
x<-sample(c(0,1,NA),20,replace=TRUE)
y<-sample(c(0:2,NA),20,replace=TRUE)
z<-sample(c(0:5,NA),20,replace=TRUE)
a<-sample(c(7,11,13,NA),20,replace=TRUE)
b<-sample(c(51,NA),20,replace=TRUE)
c<-sample(c(rnorm(2,1,0.05),NA),20,replace=TRUE)
df<-data.frame(x,y,z,a,b,c)
df

输出

  x y z a b c
1 1 1 3 13 51 1.011752
2 NA 1 1 NA NA 1.011752
3 0 0 2 11 NA 1.092852
4 NA 0 4 7 51 1.011752
5 NA 1 5 11 51 NA
6 1 NA 0 7 51 NA
7 0 1 5 11 51 1.092852
8 0 0 5 7 NA 1.011752
9 1 1 3 NA NA 1.092852
10 1 NA 2 7 51 1.011752
11 0 1 3 NA 51 1.011752
12 NA 1 4 11 51 NA
13 1 NA 3 NA NA 1.011752
14 NA 0 5 11 51 1.011752
15 0 NA 0 NA NA NA
16 NA 0 3 7 NA 1.092852
17 NA NA NA NA 51 NA
18 NA 1 3 11 51 1.011752
19 NA NA 0 11 51 NA
20 NA NA 0 11 NA NA

加载 zoo 包并用同一列中的最后一个观察值替换 NA 值 −

示例

library(zoo)
na.locf(df)

输出

  x  y z  a  b     c
2 1 1 4  7  51  1.031294
3 0 2 3  7  51  1.031294
4 0 2 2  13  51  1.031294
5 0 0 3  13  51  0.954332
6 0 0 2  13  51  1.031294
7 1 2 2  13  51  1.031294
8 1 1 5  13  51  0.954332
9 1 1 3  7  51   1.031294
10 1 1 3  7  51  0.954332
11 0 1 0  7  51  0.954332
12 0 1 2  13 51 0.954332
13 1 1 4  7  51  0.954332
14 0 2 4  7  51  0.954332
15 0 0 0  11  51  0.954332
16 0 0 1  13  51 0.954332
17 0 0 0  13  51  0.954332
18 0 2 2  11  51  1.031294
19 0 2 3  7  51   0.954332
20 1 2 3  7  51   0.954332

我们来看另一个例子−

示例

v1<-sample(c(rexp(5,1),NA),20,replace=TRUE)
v2<-sample(c(runif(5,1,2),NA),20,replace=TRUE)
v3<-sample(c(rnorm(4,0.95,0.04),NA),20,replace=TRUE)
df_v<-data.frame(v1,v2,v3)
df_v

输出

    v1        v2         v3
1  0.3197994  1.664430  0.9608500
2  0.7260356  1.951135  0.9741401
3  0.2851354  1.951135  0.9741401
4  NA         1.354400  0.9155426
5  0.4840855  1.951135  0.9155426
6  0.7260356  1.927019  0.9155426
7  0.3197994  1.602498  0.9608500
8  0.3197994  1.602498  NA
9  0.7260356  1.951135  NA
10 0.4840855  1.354400  NA
11 NA         1.664430  NA
12 0.7260356  1.927019  NA
13 0.3197994  1.951135  0.9741401
14 0.2851354  1.354400  0.9155426
15 2.3741214  1.602498  0.9290660
16 0.3197994  1.354400  0.9290660
17 0.7260356  1.951135  0.9155426
18 0.3197994  1.354400  0.9608500
19 0.7260356  1.664430  0.9290660
20 NA         1.602498  NA

用同一列中的最后一个观察值替换 NA 值 −

示例

na.locf(df_v)

输出

       v1       v2      v3
1  0.1109255 1.687216 0.9349647
2  0.1109255 1.687216 0.9611297
3  0.1862784 1.025610 0.9405675
4  0.1862784 1.278997 0.9517017
5  0.1109255 1.341934 0.9517017
6  0.1862784 1.687216 0.9517017
7  0.3978860 1.687216 0.9349647
8  0.1862784 1.025610 0.9517017
9 0.6972909 1.687216 0.9405675
10 0.1109255 1.199711 0.9405675
11 0.1109255 1.199711 0.9611297
12 0.6972909 1.199711 0.9349647
13 0.1862784 1.199711 0.9611297
14 0.3978860 1.025610 0.9349647
15 0.6972909 1.341934 0.9349647
16 0.3978860 1.025610 0.9405675
17 0.6972909 1.199711 0.9517017
18 0.1862784 1.687216 0.9517017
19 0.1862784 1.025610 0.9405675
20 0.6972909 1.025610 0.9611297

相关文章