仅删除 R 中数据集开头和结尾处所有选定列的带有 NA 的行

问题描述 投票:0回答:1

鉴于下面的数据集...

col1  col2  var1  var2  var3
   1     1    NA    NA    NA
   2     2    NA    NA    NA
   3     3    NA     3    NA
   4     4     4     4     4
   5     5     5     5     5
   6     6     6    NA     6
   7     7    NA     7     7
   8     8    NA    NA    NA
   9     9     9    NA    NA
  10    10    NA    NA    NA

...如何以自动方式删除开头和结尾处包含 all selectonly 的 NA 的行(最好使用 tidyverse)?

col1  col2  var1  var2  var3
   3     3    NA     3    NA
   4     4     4     4     4
   5     5     5     5     5
   6     6     6    NA     6
   7     7    NA     7     7
   8     8    NA    NA    NA
   9     9     9    NA    NA

那么在上面的示例中,如何仅在数据集的开头和结尾删除所有 var1-var3 列中包含 NA 的行?也就是说,只有第 1、2 和 10 行应该消失。 (虽然第 8 行包含所有这些选择变量的 NA,但不应将其删除,因为它不在数据集的“开始”或“结束”处。)

这是我的 tidyverse 解决方案:

library(tidyverse)
have <- tibble(col1 = 1:10, col2 = 1:10, var1 = 1:10, var2 = 1:10, var3 = 1:10)
have[c(1, 2, 10), 3:5] <- NA
have[3, c(3, 5)] <- NA
have[6, 4] <- NA
have[7, 3] <- NA
have[8, 3:5] <- NA
have[9, 4:5] <- NA

no_select_vars <- 3 # The number of select variables
want <- have |>
  mutate(no_missing = rowSums(across(-c(col1, col2), ~ is.na(.x)))) |>
  slice(first(which(no_missing < no_select_vars)):n()) |>
  slice(1:last(which(no_missing < no_select_vars))) |>
  select(-no_missing)

是否有用于此目的的现有功能,或者比我的更优雅的解决方案?

r tidyverse na
1个回答
0
投票
library(tidyverse)

have %>%
  mutate(no_miss = !if_all(contains("var"), is.na)) %>%
  filter(cumany(no_miss) & rev(cumany(rev(no_miss))))
© www.soinside.com 2019 - 2024. All rights reserved.