繁体   English   中英

在 R 中填充 dataframe 中的缺失值

[英]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_elseleadlag你可以这样做:

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:我使用-99NA作为lagleaddefault ,而-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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM