我有一个类似于这篇文章的问题:Fill in values between start and end value in R
不同之处在于,我需要在多个值的开始和结束之间填写值,并且它不包含和ID列:
我的数据看起来如下(原始数据有许多不同的值):

我的最终结果应该如下所示:

数据:
structure(list(elevation = c(150L,140L, 130L, 120L, 110L, 120L, 130L, 140L, 150L, 90L, 80L, 70L,66L, 60L, 50L, 66L, 70L, 72L, 68L, 65L, 60L, 68L, 70L),code = c(NA, NA, "W", NA, NA, NA, "W", NA, NA, NA, NA, NA, "X", NA, NA, "X", NA, NA, "Y", NA, NA, "Y", NA)), class = "data.frame", row.names = c(NA,-23L))提前感谢
发布于 2022-11-09 20:20:21
df %>%
mutate(code = runner::fill_run(code, only_within = T))
elevation code
1 150 <NA>
2 140 <NA>
3 130 W
4 120 W
5 110 W
6 120 W
7 130 W
8 140 <NA>
9 150 <NA>
10 90 <NA>
11 80 <NA>
12 70 <NA>
13 66 X
14 60 X
15 50 X
16 66 X
17 70 <NA>
18 72 <NA>
19 68 Y
20 65 Y
21 60 Y
22 68 Y
23 70 <NA>发布于 2022-11-09 20:13:47
这可能不是很漂亮,但它有效:
codepos <- which(!is.na(dd$code))
stopifnot(length(codepos)%%2==0)
for (group in split(codepos, (seq_along(codepos)+1)%/%2)) {
stopifnot(dd$code[group[1]] == dd$code[group[2]])
dd$code[group[1]:group[2]] <- dd$code[group[1]]
}我们从找到所有的非NA代码开始。我们假设它们总是成对的值,然后只填写每对的范围。
发布于 2022-11-09 20:22:47
下面是一种tidyverse方法。它通过为通过交替的NA和字符给出的模式赋值来生成临时分组。
library(dplyr)
library(tidyr)
df %>%
mutate(n = n(), l_c = lag(code)) %>%
group_by(grp = cumsum(lag(!is.na(code), default = F) == is.na(code)),
grp_in = grp %in% seq(2, unique(n), 4)) %>%
fill(l_c) %>%
ungroup() %>%
mutate(code = ifelse(grp_in, l_c, code)) %>%
select(elevation, code) %>%
print(n = Inf)
# A tibble: 23 × 2
elevation code
<int> <chr>
1 150 NA
2 140 NA
3 130 W
4 120 W
5 110 W
6 120 W
7 130 W
8 140 NA
9 150 NA
10 90 NA
11 80 NA
12 70 NA
13 66 X
14 60 X
15 50 X
16 66 X
17 70 NA
18 72 NA
19 68 Y
20 65 Y
21 60 Y
22 68 Y
23 70 NAhttps://stackoverflow.com/questions/74380693
复制相似问题