如何用第一个非缺失值替换列中的 na 而不会使用 R 删除仅具有缺失值的案例?

How to replace na in a column with the first non-missing value without dropping cases that only have missing values using R?

我有一个包含许多 NA 的长数据框,但我想压缩它,以便在按变量分组时所有 NA 都填充第一个非缺失值——但如果观察 只有 有 NA,它会保留它。在我更新 R 之前,我有一个有效的代码(如下所示),但现在如果其中一列全部为 NA,它会删除行。

这是一个示例数据集:

library(dplyr)

test <- tibble(name = c("J", "C", "J", "C"),
               test_1 = c(1:2, NA, NA),
               test_2 = c(NA, NA, 3:4),
               make_up_test = c(NA, 1, NA, NA))

这是过去的工作方式——但现在删除了在一列中只有 NA 的观察结果(见 J 被删除,因为他只有 NA 用于测试观察)


test %>%
  group_by(name) %>%
  summarise_all(~first(na.omit(.)))

这是我希望得到的:

solution <- tibble(name = c("J", "C"),
                test_1 = c(1:2),
                test_2 = c(3:4),
                make_up_test = c(NA, 1))

我们用 na.omit 删除 NA 并得到 first 元素 - 如果没有 [=21],则使用 [1] 强制转换为 NA =] 元素存在

library(dplyr)
test %>% 
  group_by(name) %>% 
  summarise(across(everything(), ~ first(na.omit(.x))[1]))

-输出

# A tibble: 2 × 4
  name  test_1 test_2 make_up_test
  <chr>  <int>  <int>        <dbl>
1 C          2      4            1
2 J          1      3           NA

这是一种旋转方法:

library(tidyr)
library(dplyr)

test %>% 
  pivot_longer(-name, names_to = "names") %>%  
  drop_na() %>% 
  pivot_wider(names_from = names, values_from = value) %>% 
  relocate(test_2, .after = test_1)
  name  test_1 test_2 make_up_test
  <chr>  <dbl>  <dbl>        <dbl>
1 J          1      3           NA
2 C          2      4            1