我正在尝试填充数据框的 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/