r - 根据组的第一个值填充每组的 NA 值

标签 r tidyr

我正在尝试填充数据框的 NA 值。但是,我想根据每个组的第一个值来填充它们。

#> df = data.frame(
    group = c(rep("A", 4), rep("B", 4)),
    val = c(1, 2, NA, NA, 4, 3, NA, NA)
  )
#> df
  group val
1     A   1
2     A   2
3     A  NA
4     A  NA
5     B   4
6     B   3
7     B  NA
8     B  NA
#> fill(df, val, .direction = "down")
  group val
1     A   1
2     A   2
3     A   2 # -> should be 1
4     A   2 # -> should be 1
5     B   4
6     B   3
7     B   3 # -> should be 4
8     B   3 # -> should be 4

我可以使用 tidyr::fill() 来实现吗?还是有另一种(或多或少优雅)的方法来做到这一点?我需要在更长的链 (%>%) 操作中使用它。

非常感谢!

最佳答案

在分组中使用 tidyr::replace_na()dplyr::first()(或 val[[1]]) mutate():

library(dplyr)
library(tidyr)

df %>% 
  group_by(group) %>% 
  mutate(val = replace_na(val, first(val))) %>% 
  ungroup()

#> # A tibble: 8 × 2
#>   group   val
#>   <chr> <dbl>
#> 1 A         1
#> 2 A         2
#> 3 A         1
#> 4 A         1
#> 5 B         4
#> 6 B         3
#> 7 B         4
#> 8 B         4

PS - @richarddmorey 指出了组的第一个值为 NA 的情况。上面的代码会将所有 NA 值保留为 NA。如果您想替换为每组的第一个非缺失值,您可以使用 !is.na() 对向量进行子集化:

df %>% 
  group_by(group) %>% 
  mutate(val = replace_na(val, first(val[!is.na(val)]))) %>% 
  ungroup()

创建于 2022-11-17 reprex v2.0.2

关于r - 根据组的第一个值填充每组的 NA 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74478922/

相关文章:

r - 替换未知类别中的中位数时,在 R 中获取 NA

返回带小数位的值中第一个小于 5 的数字的位置

r - 在 R 中将千位格式化为 Ks

r - 过滤掉 R 中特定样本对中存在的观察结果

r - 使用 dplyr 连接组内的所有行

r - tidyr:具有不同 NA 计数的多次取消嵌套

r - 在 tidyverse 中每隔一行填充上一层

r - 按多列的值组合数据集

r - Tidyr 如何传播到发生次数

R - 从长到宽再回到相同的长格式