![](/img/trans.png)
[英]Fill missing values in a dataframe based on values from another dataframe R
[英]Fill missing values in dataframe in R
我遇到以下问题:我有一个包含多个列的 dataframe。 (见下文)我正在尝试填写缺失值。 具体来说,我只想在缺少值之前和之后有一个数据点并且它们相等时填写值。 请注意,我也有不同的 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 但我没有看到一个明确的方法来做到这一点。
十分感谢你的帮助!
使用if_else
和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:我使用-99
和NA
作为lag
和lead
的default
,而-999
默认值。 否则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"
)
)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.