在R中填写起始值和结束值之间的值

shi*_*iny 3 r

我的 data.frame 中的 W(下面的蓝线)表示河流中的水位与高程剖面相交的位置。

在此输入图像描述

在我的 data.frame 中,对于 ID 中的每个组,我需要填写起始值和结束值 (W) 之间的值

我的数据

> head(df, 23)
   ID elevation code
1   1       150 <NA>
2   1       140 <NA>
3   1       130    W
4   1       120 <NA>
5   1       110 <NA>
6   1       120 <NA>
7   1       130    W
8   1       140 <NA>
9   1       150 <NA>
10  2        90 <NA>
11  2        80 <NA>
12  2        70 <NA>
13  2        66    W
14  2        60 <NA>
15  2        50 <NA>
16  2        66    W
17  2        70 <NA>
18  2        72 <NA>
19  2        68    W
20  2        65 <NA>
21  2        60 <NA>
22  2        68    W
23  2        70 <NA>
Run Code Online (Sandbox Code Playgroud)

我希望最终结果如下所示

   ID elevation code
1   1       150 <NA>
2   1       140 <NA>
3   1       130    W
4   1       120    W
5   1       110    W
6   1       120    W
7   1       130    W
8   1       140 <NA>
9   1       150 <NA>
10  2        90 <NA>
11  2        80 <NA>
12  2        70 <NA>
13  2        66    W
14  2        60    W
15  2        50    W
16  2        66    W
17  2        70 <NA>
18  2        72 <NA>
19  2        68    W
20  2        65    W
21  2        60    W
22  2        68    W
23  2        70 <NA>
Run Code Online (Sandbox Code Playgroud)

我尝试了很多事情,但我的尝试并不成功。我们将不胜感激您的帮助。

数据

> dput(df)
structure(list(ID = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), 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, "W", NA, NA, "W", 
NA, NA, "W", NA, NA, "W", NA)), class = "data.frame", row.names = c(NA, 
-23L))
Run Code Online (Sandbox Code Playgroud)

Ony*_*mbu 5

你可以这样做:

df %>%
  group_by(ID)%>%
  mutate(code = coalesce(code, c(NA, "W")[cumsum(!is.na(code)) %% 2 + 1]))

   ID elevation code
1   1       150 <NA>
2   1       140 <NA>
3   1       130    W
4   1       120    W
5   1       110    W
6   1       120    W
7   1       130    W
8   1       140 <NA>
9   1       150 <NA>
10  2        90 <NA>
11  2        80 <NA>
12  2        70 <NA>
13  2        66    W
14  2        60    W
15  2        50    W
16  2        66    W
17  2        70 <NA>
18  2        72 <NA>
19  2        68    W
20  2        65    W
21  2        60    W
22  2        68    W
23  2        70 <NA>
Run Code Online (Sandbox Code Playgroud)