如何用第一个非缺失值替换列中的 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
我有一个包含许多 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