我并没有成功使用LOCF方法

问题描述 投票:0回答:1

我现在正在处理具有许多缺失值的数据集。我正在使用LOCF方法来替换缺失值(因为它是重复测量)。我使用na.locf函数来替换缺少的值。这是我在创建的数据帧上所做的模拟示例

library(zoo)
ID<-c(rep(01,3),rep(02,3),rep(03,3),rep(07,3),rep(08,3),rep(10,3),rep(11,3),rep(13,3))
AA<-c(2,2,3,NA,2,3,4,1,NA,3,2,1,0,2,1,3,0,3,2,1,4,NA,2,NA)
BB<-c(2,3,0,4,1,3,1,0,2,3,4,3,1,0,NA,3,4,0,1,2,3,3,2,NA)
CC<-c(NA,2,3,4,3,4,2,3,2,3,5,1,NA,3,0,0,1,2,3,NA,3,2,1,2)
DD<-c(NA,3,3,2,1,13,4,22,2,3,NA,2,3,0,2,1,2,3,NA,3,2,1,4,2)
Jr<-rep(c("J0","J1","J2"),8)
data_rep<-data.frame(ID,Jr,AA,BB,CC,DD)
data_rep_locf<-na.locf(data_rep,na.rm=FALSE)

这里是替换缺失值之前的数据框。

data_rep
  ID Jr AA BB CC DD
1   1 J0  2  2 NA NA
2   1 J1  2  3  2  3
3   1 J2  3  0  3  3
4   2 J0 NA  4  4  2
5   2 J1  2  1  3  1
6   2 J2  3  3  4 13
7   3 J0  4  1  2  4
8   3 J1  1  0  3 22
9   3 J2 NA  2  2  2
10  7 J0  3  3  3  3
11  7 J1  2  4  5 NA
12  7 J2  1  3  1  2
13  8 J0  0  1 NA  3
14  8 J1  2  0  3  0
15  8 J2  1 NA  0  2
16 10 J0  3  3  0  1
17 10 J1  0  4  1  2
18 10 J2  3  0  2  3
19 11 J0  2  1  3 NA
20 11 J1  1  2 NA  3
21 11 J2  4  3  3  2
22 13 J0 NA  3  2  1
23 13 J1  2  2  1  4
24 13 J2 NA NA  2  2

现在是替换缺失值后的输出

data_rep_locf
   ID Jr AA BB CC DD
1   1 J0  2  2 NA NA
2   1 J1  2  3  2  3
3   1 J2  3  0  3  3
4   2 J0  3  4  4  2
5   2 J1  2  1  3  1
6   2 J2  3  3  4 13
7   3 J0  4  1  2  4
8   3 J1  1  0  3 22
9   3 J2  1  2  2  2
10  7 J0  3  3  3  3
11  7 J1  2  4  5  3
12  7 J2  1  3  1  2
13  8 J0  0  1  1  3
14  8 J1  2  0  3  0
15  8 J2  1  0  0  2
16 10 J0  3  3  0  1
17 10 J1  0  4  1  2
18 10 J2  3  0  2  3
19 11 J0  2  1  3  3
20 11 J1  1  2  3  3
21 11 J2  4  3  3  2
22 13 J0  4  3  2  1
23 13 J1  2  2  1  4
24 13 J2  2  2  2  2

[如果查看AA列和第4行的值,则取同一列(即3)的第3行的值。第0天的ID 2是ID 1的第2天的值,而它们是不同的个体。相反,我希望在AA列中获取ID2的第0天的NA(以另一种方式替换没有LOCF方法的第0天的值)。如何处理此问题并同时使用LOCF方法。

最诚挚的问候!

r
1个回答
0
投票
[1] by使用by将数据分割成每个ID的组件,并使用它将na.locf应用于每个此类组件。最后rbind将这些组件放在一起。没有使用其他软件包。

do.call("rbind", by(data_rep, data_rep$ID, na.locf, na.rm = FALSE))

2)ave
另一种方法是在每列上使用ave。没有使用其他软件包。

locf <- function(x) na.locf(x, na.rm = FALSE) replace(data_rep, TRUE, lapply(data_rep, function(x) ave(x, data_rep$ID, FUN = locf)))

3)dplyr
另一种方法是在dplyr包中使用group_by

library(dplyr) data_rep %>% group_by(ID) %>% na.locf(na.rm = FALSE) %>% ungroup

4)data.table

library(data.table) DT <- as.data.table(data_rep) DT[, na.locf(.SD, na.rm = FALSE), by = ID]

© www.soinside.com 2019 - 2024. All rights reserved.