1

我是 R 新手。我希望替换数据中 X 的缺失值。对于相同的“ID”和相同的“日”,当“时间”= 3 时,如何将“时间”= 1 和 2 时的“X”的缺失值替换为“X”的值

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

 ID   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 和 data.table 编写并运行以下代码,但后来当我检查数据时,它不起作用——当 time=1 和 2 时,X 值仍然具有所有缺失值。我的代码有什么问题吗?有什么建议么?我在 R 方面的经验非常有限。在此先感谢您!

setDT(data1) data1 <- data1 [order(-Time), X := na.locf(X), by = .(ID, Day)]

4

3 回答 3

2

这里有 2 个选项:

1)使用滚动加入data.table

DT[, X1 :=
    DT[!is.na(X)][.SD, on=.(ID, Day, Time), roll=-Inf, x.X]
]

2)data.table::nafill在按 ID、Day 和降序时间排序后,按 ID 和 Day 使用 "locf":

DT[order(ID, Day, -Time), X2 := nafill(X, "locf"), .(ID, Day)]

输出:

    ID Day Time   X  X1  X2
 1:  1   1    1  NA 7.4 7.4
 2:  1   1    2  NA 7.4 7.4
 3:  1   1    3 7.4 7.4 7.4
 4:  1   2    1  NA 6.2 6.2
 5:  1   2    3 6.2 6.2 6.2
 6:  2   1    1  NA 7.1 7.1
 7:  2   1    2  NA 7.1 7.1
 8:  2   1    3 7.1 7.1 7.1
 9:  2   2    3 5.9 5.9 5.9
10:  2   2    2  NA 5.9 5.9
11:  2   2    1  NA 5.9 5.9
12:  2   3    1  NA  NA  NA
13:  2   3    2  NA  NA  NA
14:  2   3    3  NA  NA  NA

数据:

library(data.table)
DT <- fread("ID   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
2 3 1 NA
2 3 2 NA
2 3 3 NA")
于 2020-04-27T02:40:21.257 回答
1

在问题的示例中,每个组最多有一个非缺失值,并且在每种情况下,该值都将分配给该组中的每个值,因此如果这是一般情况,则规则简化为分配单个非 NA 值到组中的所有 X 值:

data1[, X := na.omit(X), .(ID, Day)]
于 2020-04-27T15:20:42.933 回答
1

我们可以使用replace

setDT(data1)
data1[, X := replace(X, is.na(X), X[Time == 3]), .(ID, Day)]

#    ID Day Time   X
# 1:  1   1    1 7.4
# 2:  1   1    2 7.4
# 3:  1   1    3 7.4
# 4:  1   2    1 6.2
# 5:  1   2    3 6.2
# 6:  2   1    1 7.1
# 7:  2   1    2 7.1
# 8:  2   1    3 7.1
# 9:  2   2    3 5.9
#10:  2   2    2 5.9
#11:  2   2    1 5.9

同样使用dplyr.

library(dplyr)
data1 %>% group_by(ID, Day) %>% mutate(X =replace(X, is.na(X), X[Time == 3]))

Time == 3如果您在使用的组中有超过 1 个值which.max

data1[, X := replace(X, is.na(X), X[which.max(Time == 3)]), .(ID, Day)]

当没有价值时,Time == 3我们可以使用:

data1[, X := if(any(Time == 3)) replace(X, is.na(X), X[which.max(Time == 3)]), .(ID, Day)]
于 2020-04-27T02:38:34.403 回答