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