Проверьте, существует ли в фрейме данных строка со всеми `NA`

#r #dataframe

#r #фрейм данных

Вопрос:

Проверьте, существует ли в фрейме данных строка со всеми NA . Например, ответ для этого фрейма данных — да:

 my.df <- data.frame(a=c(1, NA, 3), b=c(5, NA, NA))
 

но это неверно для следующего

 my.df2 <- data.frame(a=c(1, 2, 3), b=c(5, NA, NA))
 

Ответ №1:

Одним из вариантов является создание функции, которая преобразует данные в логическую матрицу ( is.na ), получает сумму элементов NA по строкам, проверяет, равно ли оно количеству столбцов, и переносит, если есть any строки, которые соответствуют

 f1 <- function(dat) any(rowSums(is.na(dat)) == ncol(dat))

f1(my.df)
#[1] TRUE
f1(my.df2)
#[1] FALSE
 

ПРИМЕЧАНИЕ: rowSums векторизован и должен быть очень быстрым


Или другой вариант с tidyverse

 library(dplyr)
f2 <- function(dat) {
     dat %>%
         filter(across(everything(), is.na)) %>%
         nrow %>% 
         magrittr::is_greater_than(0)
  }

f2(my.df)
#[1] TRUE
f2(my.df2)
#[1] FALSE
 

Ответ №2:

Другим вариантом может быть:

 #Code
myfun <- function(x)
{
  y <-apply(x,1,function(x) length(which(is.na(x))))
  any(y==ncol(x))
}
#Apply
myfun(my.df)
myfun(my.df2)
 

Вывод:

 myfun(my.df)
[1] TRUE
myfun(my.df2)
[1] FALSE
 

Ответ №3:

 allNA <- apply(my.df, 1, function(x) all(is.na(x)))
allNA
[1] FALSE  TRUE FALSE
sum(allNA) # determine if there is at least 1 allNA row
[1] 1
 

Ответ №4:

Вы можете использовать rowSums и is.na :

 my.df[which(rowSums(is.na(my.df[]))==2),]
   a  b
2 NA NA
 

Если у вас есть фреймы данных с переменным количеством столбцов, вы можете использовать length :

 my.df[which(rowSums(is.na(my.df[])) == length(my.df)),]
 

Ответ №5:

Другой базовый параметр R использует any Reduce asplit

 any(Reduce("amp;", asplit(is.na(df), 2)))
 

где df находятся входные данные.фрейм