Невозможно заставить оператор 'Or' работать внутри фильтра dplyr - PullRequest
0 голосов
/ 30 января 2020

Я использую R (RStudio) уже пару недель, и столкнулся с проблемой, которую я не знаю, как объяснить. Я также нигде не могу найти упоминания об этом в Интернете, и мой код, кажется, соответствует стандартам, установленным большинством интерактивных руководств по самопомощи. Скорее всего, это связано с моим ограниченным пониманием R. Любые предложения будут оценены.

Я читаю в электронной таблице Excel (dataInput <- readxl::read_xlsx('demo.xlsx')), которая затем сохраняется как тиббл, вот так (это только демонстрационные данные):

   Val  Colour Range  Rate
  <dbl> <chr>  <dbl> <dbl>
1    NA red       10   0.1
2    NA blue       2   0.2
3     1 green      3   0.3
4     1 red       NA   0.4
5     0 blue       5   0.5
6     0 green      4   0.6
7     3 red        6  NA  
8     3 blue       7   0.7

Я хочу использовать dplyr::filter, чтобы отфильтровать все строки из этой таблицы, в которых Val равен NA или 0, а затем выбрать указанные столбцы. Для этого мой код выглядит следующим образом:

dataOutput <- dplyr::filter(dataInput, Val != 0 | Val != "") %>%
              dplyr::select(c(Val, Colour, Rate))

Я предполагал, что использование оператора 'или' будет означать, что строки в Val, которые содержат 0 или являются пустыми, будут удален, и поэтому мой выходной тиббл будет выглядеть так:

   Val  Colour  Rate
  <dbl> <chr>  <dbl>
1     1 green    0.3
2     1 red      0.4
3     3 red     NA  
4     3 blue     0.7

Вместо , кажется, что код R производит что-то, в чем удаляются пустые строки в Val, но не строк, содержащих 0:

   Val  Colour  Rate
  <dbl> <chr>  <dbl>
1     1 green    0.3
2     1 red      0.4
3     0 blue     0.5
4     0 green    0.6
5     3 red     NA  
6     3 blue     0.7

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

dataOutput <- dplyr::filter(dataInput, Val != 0) %>%
              dplyr::filter(Val != "") %>%
              dplyr::select(c(Val, Colour, Rate))

- - или, как ни странно, с помощью оператора & вместо оператора |, но я обеспокоен тем, что, если я что-то неправильно понимаю, это может вызвать проблемы в моих данных, которые я не знаю, как определить. Это означало бы, что я не могу доверять выводу моего скрипта.

RStudio не выдает никаких сообщений об ошибках, но это поведение согласованно независимо от того, какой набор данных я использую, или даже какие столбцы я пытаюсь отфильтровать (будь то один или два разных столбца). У кого-нибудь есть мысли?

Ответы [ 2 ]

4 голосов
/ 30 января 2020

Вы хотите is.na(), так как вы пытаетесь обнаружить значения NA, а не пустые строки.

Ваш лог c в настоящее время говорит give me the rows that are either not equal to 0 OR are not empty. Строки, содержащие 0, не являются пустыми, поэтому они удовлетворяют последнему условию и остаются в ваших данных.

Вы хотите вместо give me the rows that are not equal to 0 AND are not NA.

dataOutput <- dplyr::filter(dataInput, Val != 0 & !is.na(Val)) %>%
              dplyr::select(c(Val, Colour, Rate))
0 голосов
/ 30 января 2020
dataOutput <- dplyr::filter(dataInput, !Val %in% c(0, ""))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...