我现在正在处理具有许多缺失值的数据集。我正在使用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方法。
最诚挚的问候!
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]