R DPLYR 填写值

问题描述 投票:0回答:1
library(dplyr)

df <- data.frame(ID = c(1, 1, 1, 1, 2, 2, 3, 3, 3), X1 = c(5, NA, NA, NA, 7, NA, 4, 7, 10), WANT = c(5, 8, 11, 14, 7, 10, 4, 7, 10))

df <- df %>%
  group_by(ID) %>%
  mutate(WANT = ifelse(is.na(X1), lead(X1) + 3, X1)) %>%
  ungroup()

我有 ID 为 X1 的 df,并希望创建 WANT - 当 NA 时将“3”添加到下一个值

r dplyr fill
1个回答
0
投票

使用

lag()
而不是
lead()
让您更接近您想要的东西。 但这并不能根据需要处理连续的
NA

library(dplyr)

df |>
  mutate(WANT = ifelse(is.na(X1), lag(X1) + 3, X1),
         .by = ID)
#> # A tibble: 9 × 3
#>      ID    X1  WANT
#>   <dbl> <dbl> <dbl>
#> 1     1     5     5
#> 2     1    NA     8
#> 3     1    NA    NA
#> 4     1    NA    NA
#> 5     2     7     7
#> 6     2    NA    10
#> 7     3     4     4
#> 8     3     7     7
#> 9     3    10    10

如果您想为每个连续的

3
添加
NA
,您可以使用
coalesce()
cumsum()

df |>
  mutate(WANT = coalesce(X1, 3),
         WANT = cumsum(WANT),
         .by = ID)
#> # A tibble: 9 × 3
#>      ID    X1  WANT
#>   <dbl> <dbl> <dbl>
#> 1     1     5     5
#> 2     1    NA     8
#> 3     1    NA    11
#> 4     1    NA    14
#> 5     2     7     7
#> 6     2    NA    10
#> 7     3     4     4
#> 8     3     7    11
#> 9     3    10    21
© www.soinside.com 2019 - 2024. All rights reserved.