如何在使用R语言时将列中的NA值替换为第一个非缺失值,而不丢弃仅包含缺失值的案例?

3

我有一个很长的数据框,其中有很多NAs。但是我想将它压缩,使所有NAs都用按变量分组时的第一个非缺失值填充 - 但如果观测值只有NAs,则保留它。在我更新R之前,我有一个可行的代码(如下所示),但现在如果它们的某个列全部为NAs,则会删除行。

这是一个样本数据集:

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))

以下是曾经有效的代码——但现在删除了只在一个列中包含NAs的观测值(请注意,J被删除了,因为他在测试观测中仅具有NAs)


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

This is what I'm hoping to get:

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

2个回答

3
我们使用 na.omit 去除 NA,并获取第一个元素 - 使用 [1] 把其强制转换为 NA(如果没有非 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

2

这里有一种使用枢轴的方法:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接