我没有成功使用LOCF方法

时间:2019-11-25 22:58:16

标签: r

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

最诚挚的问候!

2 个答案:

答案 0 :(得分:2)

1)通过使用by将数据拆分为每个ID的组件,然后将其应用于na.locf到每个此类组件。最后,rbind将这些组件放在一起。无需使用其他软件包。

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

2)ave 另一种方法是在每列上使用ave。没有使用其他软件包。请注意,na.locf0na.locf类似,但仅适用于矢量,默认值为na.rm = FALSE

AVE <- function(x) ave(x, data_rep$ID, FUN = na.locf0)
replace(data_rep, TRUE, lapply(data_rep, AVE))

2a)如果可以覆盖输入内容,则可以紧凑地写为:

AVE <- function(x) ave(x, data_rep$ID, FUN = na.locf0)
data_rep[] <- lapply(data_rep, AVE)

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]

请注意,此问题与该问题类似,除了此问题有多列-Carry Last Observation Forward by ID in R

答案 1 :(得分:0)

感谢G. Grothendieck的回答,它解决了我的问题。但是dplyr方法(我通常也喜欢)似乎不起作用,因为AA列中第4行的值仍然是3(即先前主题的最后一个值)而不是NA