我有以下問題:我有一個包含幾列的資料框。(見下文)我正在嘗試填寫缺失值。具體來說,我只想在缺失值之前和之后有一個資料點且它們相等時填寫值。請注意,我也有不同的 ID,所以我想為每個 ID 執行此操作。例如,在下面的示例中,我想在 2017 年為第 2 行填寫 1,在倒數第二行為 ID 2 我想填寫 2(在這兩種情況下,我有相同的值“圍繞”缺失價值)。我不想填寫最后一行的值。
ID | 年 | 價值 |
---|---|---|
1 | 2016 年 | 1 |
1 | 2017 | -8 |
1 | 2018 | 1 |
2 | 2016 年 | -8 |
2 | 2017 | 2 |
2 | 2018 | 2 |
2 | 2019 | - 8 |
2 | 2020 | 2 |
3 | 2017 | 4 |
3 | 2018 | 4 |
3 | 2019 | -9 |
我對如何解決這個問題有些無能為力。我曾嘗試使用 group_by 但我沒有看到明確的方法。
非常感謝你的幫助!
uj5u.com熱心網友回復:
使用if_else
and lead
,lag
你可以這樣做:
library(dplyr, w = FALSE)
dat |>
group_by(ID) |>
mutate(value = if_else(value < 0 &
(lag(value, default = "-99") == lead(value, default = "-999")),
lag(value), value
)) |>
ungroup()
#> # A tibble: 11 × 3
#> ID Year value
#> <int> <int> <chr>
#> 1 1 2016 1
#> 2 1 2017 1
#> 3 1 2018 1
#> 4 2 2016 -8
#> 5 2 2017 2
#> 6 2 2018 2
#> 7 2 2019 2
#> 8 2 2020 2
#> 9 3 2017 4
#> 10 3 2018 4
#> 11 3 2019 -9
注 1:NA
我使用 a-99
和 a-999
作為default
forlag
和 ,而不是默認值lead
。否則,if_else
將用 . 替換一些值NA
。
注意 2::在示例資料的第 7 行中,缺失值是 a - 8
。我認為這是一個錯字并將其替換為-8
.
資料
dat <- data.frame(
stringsAsFactors = FALSE,
ID = c(1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L),
Year = c(
2016L, 2017L, 2018L, 2016L,
2017L, 2018L, 2019L, 2020L, 2017L, 2018L, 2019L
),
value = c(
"1", "-8", "1", "-8", "2", "2",
"-8", "2", "4", "4", "-9"
)
)
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/532630.html