替换 R 中时间序列数据中的缺失值

Replacing missing values in time series data in R

我是 R 的新手。我希望替换数据中 X 的缺失值。当 "Time" = 1 或 2 时,如何用 "X" 的值替换 "X" 的缺失值,当 "Time" = 3 时,相同的 "SubID" 和相同 "Day"

SubID:主题编号

天:每个受试者的天数 (1,2,3...21)

时间:上午标记为 1,下午标记为 2,晚上标记为 3

X:只有Time为3时有效,其他都没有。

SubID Day  Time   X    
 1    1     1     NA
 1    1     2     NA
 1    1     3     7.4
 1    2     1     NA
 1    2     3     6.2
 2    1     1     NA
 2    1     2     NA
 2    1     3     7.1
 2    2     3     5.9
 2    2     2     NA
 2    2     1     NA

我在 zoo 中达到了以下代码。我在 R 方面的经验非常有限。提前谢谢你!

data2 <- transform(data1, x = na.aggregate(x,by=SubID,FUN=sum,na.rm = T))

您可以按时间降序排列数据,然后使用X[1]

library(dplyr)

df <- tibble(SubID=1, Day=1, Time=c(1,2,3), X=c(NA, NA, 2.2))

df <- df %>%
    group_by(SubID, Day) %>%
    arrange(desc(Time)) %>%
    mutate(
        X=case_when(
            is.na(X) ~ X[1],
            TRUE ~ X)
    )

我的评论解释如下:

library(data.table)
library(zoo)
setDT(data1)
data1[order(-Time),
      Xf := na.locf(X),
      by = .(SubID, Day)]

好的 setDT 函数使 data1 对象成为 data.table。然后 order(-Time) 相对于 Time 降序排列 data1(因为 -)。 Xf := na.locf(X) 通过引用创建一个新列 Xf(这意味着您不必将其分配回 data1)作为 na.locf(X),这是 [=22] 中的一个函数=] 用以前的值填充 NA 的包(在这种情况下,用 3 中的值填充 2 和 1)。最后一行指定我们要按 SubIDDay.

分组执行此操作

希望现在更清楚了,如果您还有其他疑问,请随时询问。