Удалять строки в data.frame, когда все значения строки соответствуют регулярному выражению или соответствуют группе значений - PullRequest
0 голосов
/ 10 июля 2020

У меня есть такой фрейм данных (правильные значения - это просто пример):

df <- data.frame(a=c(" ","NO_DATA","   "," ",NA,NA,3),
                 b=c("NO_DATA","NO_DATA",""," ",NA,2," "),
                 c=c("NO_DATA","NO_DATA","","",NA,2,3),
                 d=c("NO_DATA","NO_DATA","","",NA,2,3),
                 e=c("  ","NO_DATA","","",NA,2,"NO_DATA"))

        a       b       c       d       e
1         NO_DATA NO_DATA NO_DATA          <- I want to Remove this
2 NO_DATA NO_DATA NO_DATA NO_DATA NO_DATA  <- I want to Remove this
3                                          <- I want to Remove this
4                                          <- I want to Remove this
5    <NA>    <NA>    <NA>    <NA>    <NA>  <- I want to Remove this
6    <NA>       2       2       2       2  <- Preserve
7       3               3       3 NO_DATA  <- Preserve

Мне нужно удалить все строки со значениями: "", "" (или любые количество пробелов), NA, «NO_DATA»; но присутствует во всех столбцах одной строки .

Я пробовал использовать подмножество, но logi c кажется неправильным, поскольку даже это:

subset(df, a != "NO_DATA" & b != "NO_DATA")

приводит к неправильный результат:

    a b c d       e
3                  
4                  
7   3   3 3 NO_DATA

Это результат, который я хочу:

     a       b       c       d       e   
6    <NA>       2       2       2       2  
7       3               3       3 NO_DATA 

Я хотел бы использовать регулярное выражение, потому что возможные значения могут отличаться

Ответы [ 2 ]

1 голос
/ 10 июля 2020

Вы можете подмножество, используя:

df[rowSums(!sapply(df, function(x) trimws(x) %in% c("", "NO_DATA") | is.na(x))) > 0, ]

     a b c d       e
6 <NA> 2 2 2       2
7    3   3 3 NO_DATA
1 голос
/ 10 июля 2020

Вот способ удалить с помощью регулярного выражения (например, grepl()) и is.na() для идентификации NA значений.

Сначала использует rapply() для создания TRUE / FALSE фрейма данных фильтровать. Затем есть несколько способов отфильтровать оттуда. Обратите внимание, что если у вас очень большой фрейм данных, использование rowMeans() приведет к преобразованию его в матрицу (так что это может быть медленным). Обычно это не проблема, но важная оговорка. Надеюсь, это поможет !!

# Replace each cell with T/F based on the function (grepl() / is.na())
idx_df <- rapply(df, function(x) grepl("^(\\s*|NO_DATA)$", x) | is.na(x), how = "replace")

# Check if there were no matches in the function (i.e., there is at least one FALSE)
idx <- do.call(pmin, idx_df) == 0

# Check is the rowMean is less than 1 (not all TRUE)
idx2 <- rowMeans(idx_df) < 1

identical(idx, idx2) # same result
[1] TRUE

df[idx, ]
     a b c d       e
6 <NA> 2 2 2       2
7    3   3 3 NO_DATA

Кроме того, если это имеет больше смысла для вас концептуально, вы можете отрицать (!) grepl() и is.na() внутри rapply() и go оттуда . Все, что легче читать!

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