Удалить значение NA из списка фреймов данных - PullRequest
0 голосов
/ 07 ноября 2018

Я уверен, что есть очень простой ответ на этот вопрос, но я не могу его найти. В отдельной статье Как удалить пустые фреймы данных из списка? Я рассмотрел удаление пустого фрейма данных из списка фреймов данных.

Но как это сделать, если один из элементов в списке не классифицирован как фрейм данных и является просто значением NA? Немного изменив параметры вопроса выше, вы получите:

M1 <- data.frame(matrix(1:4, nrow = 2, ncol = 2))
M2 <- NA
M3 <- data.frame(matrix(9:12, nrow = 2, ncol = 2))
mlist <- list(M1, M2, M3)

Я хотел бы удалить M2 в этом случае, но у меня есть несколько примеров этих пустых фреймов данных, поэтому я хотел бы функцию, которая удаляет их все одновременно.

Я попробовал пару решений вышеупомянутого вопроса, которые не работают:

mlist[sapply(mlist, function(x) dim(x)[1]) > 0]##Error message -
##Error: (list) object cannot be coerced to type 'double'

Filter(function(x) dim(x), mlist) ###Incorrect outputs

Заранее благодарю за любую помощь!

Ответы [ 3 ]

0 голосов
/ 07 ноября 2018

Надеюсь вам помочь.

# Method 1
mlist[!is.na(mlist)]

# Method 2
replace(mlist, is.na(mlist), NULL)
0 голосов
/ 07 ноября 2018

Вот немного другой способ получить ваш результат

library(tidyverse)

M1 <- data.frame(matrix(1:4, nrow = 2, ncol = 2))
M2 <- NA
M3 <- data.frame(matrix(9:12, nrow = 2, ncol = 2))
M4 <- NA
mlist <- list(M1, M2, M3,M4)

indexes <- tibble()

for (i in 1:length(mlist)) {

  if (is.na(mlist[[i]]) == TRUE) {

    new_index <- tibble(index = i)

    indexes <- bind_rows(new_index,indexes)

  }
}

indexnums <- indexes %>% pull(index)

mlist <- mlist[-indexnums]

При этом вы проверяете, является ли каждый элемент списка NA или нет, затем добавляете индексный номер в таблицу, если он есть, затем вынимаете эти индексные номера и поднастраиваете список. Если у вас их много в наборе данных, это должно удалить их все.

0 голосов
/ 07 ноября 2018

Один из вариантов - использовать Filter для проверки, являются ли элементы списка data.frame s

Filter(is.data.frame, mlist)
#[[1]]
#  X1 X2
#1  1  3
#2  2  4

#[[2]]
#  X1 X2
#1  9 11
#2 10 12
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...