Можно создать функцию, которая преобразует данные в логическую матрицу (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
Другой вариант может быть:
#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
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
Вы можете использовать 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)),]
Другой базовый вариант R использует any
+ Reduce
+ asplit
any(Reduce("&", asplit(is.na(df), 2)))
где df
- входные данные.кадр