фильтр с несколькими указанными c условиями - PullRequest
0 голосов
/ 27 марта 2020

Мой фрейм данных имеет следующую структуру. Есть столбец A, который имеет связанные столбцы A_1, A_2, A_3, A_4 и аналогично для B.

# create dummy data frame
dummy_df=data.frame('ID'=c(1,2,3,4),'A'=c('false','false','true','false'),'A_1'=c('false','false','true','false'),'A_2'=c('true','false','false','false'),
                    'A_3'=c('false','false','true','false'),'A_4'=c('false','false','false','false'),'B'=c('false','true','false','false'),'B_1'=c('false','false','false','false'),'B_2'=c('false','true','false','false'),
                    'B_3'=c('false','false','true','false'),'B_4'=c('false','false','false','false') )

enter image description here

Проверки, которые я намереваюсь do:

1) Есть ли строки, в которых, если A = false, любая из подглав (A_1, A_2, A_3, A_4) была истинной, например, ID 1 (A = false, A_2 = правда) ниже. Для этого я пришел к следующему коду после исследования в режиме онлайн

  dummy_df %>% select(matches('ID|A|A_')) %>% filter(A=='false') %>% filter_all(any_vars(. == 'true'))

Такая же проверка должна быть выполнена для всего фрейма данных с A и подколонками, B и его подстолбцами et c. Я не могу обобщить вышеприведенное в функцию, где я могу просто ввести базовый столбец, который я хочу проверить (т. Е. A или B), и применить его к списку базовых столбцов (A или B), возвращая df_A_mistmatch, df_B_mismatch (например, идентификатор строки 3) в качестве выходных данных функции lapply с их идентификаторами в кадре.

2) Другим выходом, который помогает проверить вышеизложенное, является кросс-таблица со всеми подколонками, т. Е. Для подсчета, где A = false и A_1 или A_2 или A_3 или A_4 = true имеют счетчики> 1

После просмотра множества ссылок я вижу, что filter_at не допускает ничего, кроме Any_vars или all_vars, и не допускает множественных условий, таких как в этом случае - A = false и A_1 или A_2 или A_3 или A_4 = правда. поэтому я использовал два фильтра ниже.

Каковы оптимальные решения для указанной выше проблемы

1 Ответ

0 голосов
/ 31 марта 2020

Я предпочитаю использовать логические значения (ИСТИНА / ЛОЖЬ) вместо строк «истина» / «ложь».

Попробуйте сохранить записи с «А = ложь и любым из подзаголовков (А_1). , A_2, A_3, A_4) = true "

library(dplyr)

dummy_df %>% 
  mutate_at(vars(-ID), function(x) x == 'true') %>% 
  filter(!A & rowSums(select(., starts_with("A_"))) > 0) %>%
  mutate_at(vars(-ID), function(x) ifelse(x, 'true', 'false'))

PS. Первая mutate преобразует строки 'true' / 'false' в логические T / F, а последняя mutate преобразует обратно.

Output

#   ID     A   A_1  A_2   A_3   A_4     B   B_1   B_2   B_3   B_4
# 1  1 false false true false false false false false false false
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...