r - 根据 R 上的其他条目填写缺少的 values

我的数据集 input 缺少几个 values。我必须使用以下逻辑创建数据集 output

  • 如果 bcd 列中的任何一列有缺失,则检查对应的 a 列,并使用从该行到特定列的对应 value 填充缺失。

我试图用 dplyr 中的 _join 函数来做到这一点,但没有成功。

我可以手动完成,但是这个选项不在 table 中,因为我有一个包含多个这样的实例的大数据集。

输入

library(dplyr)

input <- tibble( a = rep(c("A", "B", "C", "D"),2 ),
        b = c(1:3, NA, rep(NA,4)),
        c = c(21:28),
        d = c(rep(NA,4), 54, NA, 34,11)) %>% 
  arrange(a)

输入视图

# A tibble: 8 × 4
#  a         b     c     d
#  <chr> <int> <int> <dbl>
#1 A         1    21    NA
#2 A        NA    25    54
#3 B         2    22    NA
#4 B        NA    26    NA
#5 C         3    23    NA
#6 C        NA    27    34
#7 D        NA    24    NA
#8 D        NA    28    11

输出 - 预期视图

# A tibble: 8 × 4
#   a         b     c     d
# <chr> <int> <int> <dbl>
# 1 A         1    21    54
# 2 A         1    25    54
# 3 B         2    22    NA
# 4 B         2    26    NA
# 5 C         3    23    34
# 6 C         3    27    34
# 7 D        NA    24    11
# 8 D        NA    28    11

回答1

使用包 https://CRAN.R-project.org/package=zoo 中的函数 na.locf 将最后的观察结果向前或反向进行。

suppressPackageStartupMessages(library(dplyr))

input <- tibble( a = rep(c("A", "B", "C", "D"),2 ),
                 b = c(1:3, NA, rep(NA,4)),
                 c = c(21:28),
                 d = c(rep(NA,4), 54, NA, 34,11)) %>% 
  arrange(a)

input %>%
  group_by(a) %>%
  mutate(across(b:d, zoo::na.locf, na.rm =  FALSE)) %>%
  mutate(across(b:d, zoo::na.locf, na.rm =  FALSE, fromLast = TRUE))
#> # A tibble: 8 × 4
#> # Groups:   a [4]
#>   a         b     c     d
#>   <chr> <int> <int> <dbl>
#> 1 A         1    21    54
#> 2 A         1    25    54
#> 3 B         2    22    NA
#> 4 B         2    26    NA
#> 5 C         3    23    34
#> 6 C         3    27    34
#> 7 D        NA    24    11
#> 8 D        NA    28    11

https://reprex.tidyverse.org (v2.0.1) 于 2022 年 5 月 14 日创建

回答2

这是仓促的估算:

library(dplyr)
input %>%
  group_by(a) %>%
  mutate(across(b:d, ~ if_else(is.na(.), na.omit(.)[1], .))) %>%
  ungroup()
# # A tibble: 8 x 4
#   a         b     c     d
#   <chr> <int> <int> <dbl>
# 1 A         1    21    54
# 2 A         1    25    54
# 3 B         2    22    NA
# 4 B         2    26    NA
# 5 C         3    23    34
# 6 C         3    27    34
# 7 D        NA    24    11
# 8 D        NA    28    11

我认为 group_by(a) 相当直观且有意义。我第一句话的“仓促”部分是我们找到第一个非NA value并使用它。其他插补技术可能使用平均值、中位数、以前的有效数据(如 Rui 的回答中的“locf”)或随机抽样。 https://cran.r-project.org/web/packages/mice/index.html 包专门用于插补。

相似文章

随机推荐

最新文章