#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
находятся входные данные.фрейм