Удаление строк в R на основе значений в нескольких столбцах - PullRequest
0 голосов
/ 15 декабря 2018

Я пытаюсь удалить строки из кадра данных.

Мне нужно удалить строки, которые имеют только «НЕТ» или пробелы во всем диапазоне столбцов, которые я предоставляю.Строки, которые должны быть удалены, должны удовлетворять следующим условиям: 1. комбинация только «НЕТ» и пробела или всего «НЕТ» или всего пробела.

Поскольку существуют случаи, когда иметь «NONE» или пробел в некоторых столбцах можно, я не могу просто отфильтровать строки при чтении в CSV с чем-то вроде

dataframe$col1 =="NONE" | str_length(dataframe$col1)==0

Я знаю, что обычно это простая проблема, когда я мог бы запустить цикл for, который переводит все значения «NONE» и пробелы в кадре данных в NA и использует complete.cases для всех нужных мне столбцов ( doc ).Тем не менее, меня специально просят использовать метод, который не меняет значения.Какие-либо предложения?

Редактировать: у меня нет данных, но вот вымышленный пример фрейма данных, который был бы аналогичен тому, с которым мне приходится работать

enter image description here

В этом кадре данных единственная строка, которая должна быть удалена, это строка 3 (или строка 4, если вы включаете заголовок).

В окончательном наборе данных будет гораздо больше столбцов, чем в приведенном примере

Ответы [ 4 ]

0 голосов
/ 15 декабря 2018

Вы можете использовать dplyr::filter_all() для этого:

library(dplyr)

df <- data.frame(column.1 = c('a', 'b', 'NONE', 'b', 'b'),
                 column.2 = c('a', 'b', '', 'b', 'b'),
                 column.3 = rep('', 5),
                 column.4 = rep('', 5),
                 column.5 = rep('', 5))

df %>%
  filter_all(any_vars(. != 'NONE' & . != ''))
0 голосов
/ 15 декабря 2018

Так как строки с NONE и пробелами должны быть удалены, это будет:

dataframe <- filter(dataframe, col1 != "NONE" & str_length(col1) != 0)
0 голосов
/ 15 декабря 2018
is.none <- function(x) tolower(x) == "none"
is.whitespace <- function(x) grepl("^\\s+$", x)
is.empty <- function(x) length(x) == 0 || x == "" || is.na(x) || is.nan(x)
is.none.whitespace.empty <- function(x) is.none(x) || is.whitespace(x) || is.empty(x)

is.none.whitespace.empty <- Vectorize(is.none.whitespace.empty)

remove.empty.rows <- function(df, cols) {
  df[!sapply(1:nrow(df), 
             function(i) all(is.none.whitespace.empty(df[i, cols]))), ]
}

Теперь вы можете проверить это:

# in your case:
remove.empty.rows(df, 1) # remove if first column content is "empty"

# but you can determine which columns should be examined for being all
# "empty".
# let's say, you want to evaluate only first, third and fifth column:
remove.empty.rows(df, c(1, 3, 5))
0 голосов
/ 15 декабря 2018

Я бы порекомендовал использовать команду filter() из пакета dplyr (часть библиотеки tidyverse).Это будет выглядеть примерно так:

dataframe_new <- filter(dataframe, col1 == "" | str_length(col1) == 0)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...