gpt4 book ai didi

当最后一个和下一个非 NA 值相等时替换 NA

转载 作者:行者123 更新时间:2023-12-01 12:08:02 30 4
gpt4 key购买 nike

我有一个示例表,其中包含一些但不是全部 NA需要替换的值。

> dat
id message index
1 1 <NA> 1
2 1 foo 2
3 1 foo 3
4 1 <NA> 4
5 1 foo 5
6 1 <NA> 6
7 2 <NA> 1
8 2 baz 2
9 2 <NA> 3
10 2 baz 4
11 2 baz 5
12 2 baz 6
13 3 bar 1
14 3 <NA> 2
15 3 <NA> 3
16 3 bar 4
17 3 <NA> 5
18 3 bar 6
19 3 <NA> 7
20 3 qux 8
我的目标是替换 NA使用消息的第一次出现(最小 index 值)和消息的最后一次出现(使用最大 index 值) 被相同“消息”包围的值按 ID
有时,NA 序列的长度仅为 1,有时它们可​​能非常长。无论如何,所有 NA被“夹在”在 NA 之前和之后的相同“消息”值之间。应填写。
上述不完整表格的输出将是:
 > output
id message index
1 1 <NA> 1
2 1 foo 2
3 1 foo 3
4 1 foo 4
5 1 foo 5
6 1 <NA> 6
7 2 <NA> 1
8 2 baz 2
9 2 baz 3
10 2 baz 4
11 2 baz 5
12 2 baz 6
13 3 bar 1
14 3 bar 2
15 3 bar 3
16 3 bar 4
17 3 bar 5
18 3 bar 6
19 3 <NA> 7
20 3 qux 8
任何使用 data.table 的指导或 dplyr这里会很有帮助,因为我什至不知道从哪里开始。
据我所知,唯一消息是子集,但这种方法没有考虑到 id :
#get distinct messages
messages = unique(dat$message)

#remove NA
messages = messages[!is.na(messages)]

#subset dat for each message
for (i in 1:length(messages)) {print(dat[dat$message == messages[i],]) }
数据:
 dput(dat)
structure(list(id = c(1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3,
3, 3, 3, 3, 3, 3, 3), message = c(NA, "foo", "foo", NA, "foo",
NA, NA, "baz", NA, "baz", "baz", "baz", "bar", NA, NA, "bar",
NA, "bar", NA, "qux"), index = c(1, 2, 3, 4, 5, 6, 1, 2, 3, 4,
5, 6, 1, 2, 3, 4, 5, 6, 7, 8)), row.names = c(NA, -20L), class = "data.frame")

最佳答案

执行 na.locf0向前和向后,如果它们相同,则使用共同值;否则,使用 NA。分组是用 ave 完成的。 .

library(zoo)

filler <- function(x) {
forward <- na.locf0(x)
backward <- na.locf0(x, fromLast = TRUE)
ifelse(forward == backward, forward, NA)
}
transform(dat, message = ave(message, id, FUN = filler))

给予:
   id message index
1 1 <NA> 1
2 1 foo 2
3 1 foo 3
4 1 foo 4
5 1 foo 5
6 1 <NA> 6
7 2 <NA> 1
8 2 baz 2
9 2 baz 3
10 2 baz 4
11 2 baz 5
12 2 baz 6
13 3 bar 1
14 3 bar 2
15 3 bar 3
16 3 bar 4
17 3 bar 5
18 3 bar 6
19 3 <NA> 7
20 3 qux 8

关于当最后一个和下一个非 NA 值相等时替换 NA,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54717876/

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