У меня есть tryCatch() предложение внутри цикла lapply(), которое будет либо выводить data.frame, если входное значение допустимо, либо NULL, если это не так. Таким образом, полученный в результате список содержит элементы обоих классов. Вот пример:

a = list(1, 2, "skere", 3)
b = lapply(a, function(x){
  tryCatch({
    out = data.frame("number" = x,
                     "mod2" = x%%2) # This will fail for characters
    return(out)
  },
  error = function(e) {})
})

Результат print(b) будет тогда:

[[1]]
  number mod2
1     1    1

[[2]]
  number mod2
1     2    0

[[3]]
NULL

[[4]]
  number mod2
1     3    1

В моем случае я хочу свернуть список фреймов данных в один фрейм данных, и dplyr::bind_rows(), к счастью, пропускает NULL. Таким образом, это не является большой проблемой сейчас, но это может быть проблемой в другом случае.

Таким образом, вопрос заключается в следующем: есть ли способ полностью исключить возвращение NULL в первую очередь?

1
Álvaro 21 Апр 2020 в 12:46

2 ответа

Лучший ответ

Как вы уже знаете, dplyr::bind_rows(b) пропустит NULL значения, поэтому вам не нужно ничего делать.

Другой способ - просто удалить те NULL значения, которые можно сделать с помощью Filter.

Filter(length, b)

#[[1]]
#  number mod2
#1      1    1

#[[2]]
#  number mod2
#1      2    0

#[[3]]
#  number mod2
#1      3    1

Или же

b[!sapply(b, is.null)]
1
Ronak Shah 21 Апр 2020 в 09:53

Вот вариант с discard из purrr

library(purrr)
discard(b, is.null)
#[[1]]
#  number mod2
#1      1    1

#[[2]]
#  number mod2
#1      2    0

#[[3]]
#  number mod2
#1      3    1
1
akrun 21 Апр 2020 в 20:13