gpt4 book ai didi

r - 我没有按照自己的意愿成功使用 LOCF 方法

转载 作者:行者123 更新时间:2023-12-04 10:58:04 24 4
gpt4 key购买 nike

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

此致!!

最佳答案

1) 来自 使用 by将数据拆分为每个 ID 的一个组件并使用它来应用 na.locf到每个这样的组件。最后rbind组件重新组合在一起。没有使用额外的包。

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

2) 大街 另一种方法是使用 ave在每一列上。没有使用额外的包。请注意 na.locf0是 lke 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 另一种方法是使用 group_by在 dplyr 包中:
library(dplyr)

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

4) 数据表
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

关于r - 我没有按照自己的意愿成功使用 LOCF 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59041337/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com