Обработка NULL после if () внутри appply - PullRequest
0 голосов
/ 27 апреля 2020

У меня есть ситуация, когда apply возвращает список со многими NULL записями. Код, который я использую, довольно длинный, поэтому я воспроизвожу проблему на простом примере.

# Generate data.
df <- data.frame(a= c(1,2, NA, 6),
                 b= c(1, 7, 3, 7))

# Return only columns that have NAs.
my_list <- apply(df, 2, function(col_i){
  if(any(is.na(col_i))){
    return(col_i)
  }})

Выполнение этого дает нам

my_list
$a
[1]  1  2 NA  6

$b
NULL

Моя проблема в том, что я получаю много Null записи, так что я не могу работать с результатами. Как можно (а) избежать подачи заявки на возврат NULL записей или (б) отменить все NULL записи в my_list?

Таким образом, ожидаемый результат будет

my_list
$a
[1]  1  2 NA  6

Опять же, реальный код, который я использую, более сложен, чем этот. Поэтому, пожалуйста, не предлагайте использовать что-то вроде df[ , !complete.cases(t(df)), drop= FALSE], которое также возвращает столбцы, которые содержат пропуски. Мой вопрос не о том, как получить столбцы с пропусками, а о том, как обрабатывать NULL записей в apply. Я хочу оставить часть if внутри apply.

1 Ответ

2 голосов
/ 27 апреля 2020

Каждая функция должна что-то возвращать, поэтому вы не можете избежать возврата чего-либо, но вы можете удалить их:

Filter(length, apply(df, 2, function(col_i) if(any(is.na(col_i))) return(col_i)))

#$a
#[1]  1  2 NA  6
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...