给出下面的数据集...

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

...如何以自动化的方式(最好使用tidyverse)删除包含all selectonly的NA的行?

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中包含Nas的那些行?也就是说,只有第1、2和10行应该消失.(虽然第8行包含所有这些 Select 变量的NAS,但不应将其删除,因为它不在数据集的"开始"或"结束"处.)

以下是我的整洁解决方案:

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)

有没有用于此目的的现有函数,或者比我的更优雅的解决方案?

推荐答案

一种方法是在所有选定列都缺失的情况下创建指示器(在本例中,如果不是所有列都缺失,则为no_miss).

然后,您可以用cumany删除所有行,直到在开头的no_miss中达到TRUE,然后在reverse中删除相同的逻辑.

library(tidyverse)

have %>%
  mutate(no_miss = !if_all(contains("var"), is.na)) %>%
  filter(cumany(no_miss) & rev(cumany(rev(no_miss))))

Output

   col1  col2  var1  var2  var3 no_miss
  <int> <int> <int> <int> <int> <lgl>  
1     3     3    NA     3    NA TRUE   
2     4     4     4     4     4 TRUE   
3     5     5     5     5     5 TRUE   
4     6     6     6    NA     6 TRUE   
5     7     7    NA     7     7 TRUE   
6     8     8    NA    NA    NA FALSE  
7     9     9     9    NA    NA TRUE 

R相关问答推荐

有没有方法将琴弦完全捕捉到R中的多边形?

为什么以及如何修复Mapview不显示所有点并且st_buffer合并一些区域R?

R的GG平行坐标图中的排序变量

行式dppr中的变量列名

使用tidyverse / Mutate的存款账户余额

大规模重新标记haven标签数据

隐藏e_mark_line的工具提示

将非重复序列高效转换为长格式

使用case_match()和char数组重新编码值

为什么舍入POSIXct会更改能力以匹配等效的POSIXct?

如何对2个列表元素的所有组合进行操作?

R Read.table函数无法对制表符分隔的数据正常工作

用R ggplot2求上、下三角形中两个变量的矩阵热图

安全地测试文件是否通过R打开

如何使这些react 表对象相互独立?

计算使一组输入值最小化的a、b和c的值

是否有可能从边界中找到一个点值?

如何在使用因子时获得Sankey图的Scale_Fill_Viridis的全范围

Broom.Mixed::Augment不适用于Sample::分析

如何在GGPlot中控制多个图例和线型