Как отфильтровать фрейм данных с условиями? - PullRequest
0 голосов
/ 21 декабря 2018

Я хочу отфильтровать базу данных по значению одного столбца.

Если столбец содержит значение 123, выделите эти строки и затем отфильтруйте C = 1;если столбец не содержит 123, выберите эти строки, а затем отфильтруйте D = 0.

Вот тест df:

Book1 <- data.frame(
  'A' = c(123, 5, 6, 12, 445, 123),
  'B' = c(4, 56, 77, 1, 2, 3),
  'C' = c(1, 1, 0, 0, 1, 0),
  'D' = c(1, 0, 0, 1, 1, 0)
)

Хотя я могу сгенерировать 2 результата:

library(tidyverse)
Book1 %>% 
  filter(A == 123) %>% 
  filter(C == 1)

Book1 %>% 
  filter(A != 123) %>% 
  filter(D == 0)

Затем используйте rbind(), чтобы получить результат:

    A  B C D
1 123  4 1 1
2   5 56 1 0
3   6 77 0 0

Однако кто-то может научить меня, как использовать filter, if_else, чтобы иметь то же самоерезультат?

Спасибо!

Ответы [ 3 ]

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

Вы можете сделать

library(dplyr)

Book1 %>%
  filter(if_else(A == 123, C == 1, D == 0))

#    A  B C D
#1 123  4 1 1
#2   5 56 1 0
#3   6 77 0 0

, что также можно сделать в базе R

Book1[with(Book1, ifelse(A == 123, C == 1, D == 0)), ]
0 голосов
/ 21 декабря 2018

просто немного другой синтаксис (без with, как предложено @Ronak Shah):

 Book1[ifelse(Book1$A == 123, Book1$C == 1, Book1$D == 0), ]
0 голосов
/ 21 декабря 2018

Вы можете использовать & (и) и | (или), чтобы различать ваши условия, то есть

filter(Book1, (A == 123 & C == 1) | (A != 123 & D == 0))
#    A  B C D
#1 123  4 1 1
#2   5 56 1 0
#3   6 77 0 0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...