如何在 data.table 对象的每一列中找到最后一个非缺失值?

要在data.table对象的每一列中找到最后一个非缺失值,我们可以使用 lapply 函数和 tail 函数来获取 NA 值。

例如,如果我们有一个data.table名为 DT的对象,那么我们可以使用以下给定的命令在 DT 的每一列中找到最后一个非缺失值 -

DT[,lapply(.SD,function(x) tail(x[!is.na(x)],1))]

示例 1

以下代码段创建了一个data.table对象 -

library(data.table)
x1<-sample(c(NA,1,2),20,replace=TRUE)
x2<-sample(c(NA,5,10),20,replace=TRUE)
x3<-sample(c(NA,100,200),20,replace=TRUE)
DT1<-data.table(x1,x2,x3)
DT1

data.table创建以下对象 -

     x1 x2 x3
1:   2  5 200
2:  NA  5 200
3:   1  5 100
4:  NA NA 100
5:   1 10 200
6:  NA 10 100
7:  NA NA 200
8:   2 10 100
9:   1 10 100
10:  1  5 200
11:  1  5  NA
12: NA  5  NA
13:  2  5 100
14: NA  5 100
15: NA 10 100
16:  2  5 200
17: NA  5  NA
18: NA NA  NA
19:  2 10 200
20:  1 NA 100

要在 DT1 的每一列中找到最后一个非缺失值,请将以下代码添加到上述代码段中 -

DT1[,lapply(.SD,function(x) tail(x[!is.na(x)],1))]
输出结果

如果您将上述所有给定的片段作为单个程序执行,它会生成以下输出 -

   x1 x2 x3
1: 1 10 100

示例 2

以下代码段创建了一个data.table对象 -

y1<-sample(c(NA,rnorm(2)),20,replace=TRUE)
y2<-sample(c(NA,rnorm(2)),20,replace=TRUE)
y3<-sample(c(NA,rnorm(2)),20,replace=TRUE)
DT2<-data.table(y1,y2,y3)
DT2

data.table创建以下对象 -

       y1         y2          y3
1:  -0.7819176  0.5451545 -1.7242281
2:  -0.4305358  NA         NA
3:  -0.7819176  0.5451545  NA
4:  -0.4305358  NA         0.3926004
5:   NA         0.2671401 -1.7242281
6:  -0.7819176  0.2671401  0.3926004
7:  -0.7819176  NA         NA
8:  -0.4305358  0.5451545 -1.7242281
9:  -0.4305358  NA        -1.7242281
10: -0.7819176  0.5451545  NA
11: -0.4305358  NA         NA
12:  NA         0.5451545  0.3926004
13: -0.4305358  NA         0.3926004
14: -0.4305358  0.5451545 -1.7242281
15:  NA         0.2671401  0.3926004
16:  NA         0.5451545 -1.7242281
17:  NA         NA         NA
18: -0.4305358  NA         NA
19: -0.7819176  0.2671401  NA
20: -0.7819176  NA        -1.7242281

要在 DT2 的每一列中找到最后一个非缺失值,请将以下代码添加到上述代码段中 -

DT2[,lapply(.SD,function(x) tail(x[!is.na(x)],1))]
输出结果

如果您将上述所有给定的片段作为单个程序执行,它会生成以下输出 -

y1 y2 y3
1: -0.7819176 0.2671401 -1.724228

示例 3

以下代码段创建了一个data.table对象 -

z1<-sample(c(NA,round(runif(2,2,10),2)),20,replace=TRUE)
z2<-sample(c(NA,round(runif(2,1,2),2)),20,replace=TRUE)
z3<-sample(c(NA,round(runif(2,10,115),2)),20,replace=TRUE)
DT3<-data.table(z1,z2,z3)
DT3

data.table创建以下对象 -

     z1    z2    z3
1:  8.94  NA    71.40
2:  NA    NA    NA
3:  8.94  NA    NA
4:  8.94  NA    71.40
5:  4.09  1.48  NA
6:  4.09  NA    NA
7:  NA    1.38  71.40
8:  8.94  NA    NA
9:  4.09  NA    NA
10: 8.94  NA    NA
11: 4.09  NA    71.40
12: 8.94  1.48  107.44
13: 8.94  1.38  NA
14: 4.09  1.38  NA
15: 8.94  1.38  107.44
16: NA    1.48  71.40
17: NA    NA    107.44
18: NA    1.38  71.40
19: 4.09  NA    NA
20: 4.09  1.48  71.40

要在 DT3 的每一列中找到最后一个非缺失值,请将以下代码添加到上述代码段中 -

DT3[,lapply(.SD,function(x) tail(x[!is.na(x)],1))]
输出结果

如果您将上述所有给定的片段作为单个程序执行,它会生成以下输出 -

    z1    z2   z3
1: 4.09 1.48 71.4