Фильтрация в группе по нескольким строкам в R

#r #if-statement #filter #dplyr #group-by

Вопрос:

У меня есть фрейм данных, выглядящий следующим образом, с идентификатором и двумя условиями:

 df <- data.frame(ID=c("A", "A", "A", "B", "C"), cond1=c("yes", "yes", "no", "no", "yes"), cond2=c("no", "no", "yes", "yes", "yes"))
df
   ID cond1 cond2
1  A   yes    no
2  A   yes    no
3  A    no   yes
4  B    no   yes
5  C   yes   yes
 

Я хочу отфильтровать идентификаторы, для которых применяются cond1 и cond2 (=да), но это не обязательно должно быть верно в одной строке. Это означает, что я хотел бы отфильтровать идентификаторы A и C, но не B.

Я пытался группировать() и фильтровать() с помощью dplyr:

 df %>%
group_by(PID)%>%
filter(cond1==yesamp;cond2==yes)
 

Но это отфильтровывает только PID/строку, в которой применяются условия 1 и 2 (поэтому используется только идентификатор C/строка 5).

Что я могу сделать, чтобы отфильтровать идентификаторы/строки по группам с двумя условиями, при которых оба значения t0 должны быть верными в пределах одной группы, но не в пределах одной строки?

Спасибо!

Ответ №1:

Вы можете использовать any

 library(dplyr)

df %>%
  group_by(ID) %>%
  filter(any(cond1 == 'yes') amp;amp; any(cond2 == 'yes')) %>%
  ungroup

#  ID    cond1 cond2
#  <chr> <chr> <chr>
#1 A     yes   no   
#2 A     yes   no   
#3 A     no    yes  
#4 C     yes   yes  
 

Комментарии:

1. Вам нужны два знака и (amp;amp; )или один (amp;) подойдет?

2. Один из них будет работать так же хорошо и возвращать тот же результат, но amp;amp; быстрее.

Ответ №2:

Один data.table из вариантов

 > setDT(df)[, .SD[all(colSums(.SD == "yes") > 0)], ID]
   ID cond1 cond2
1:  A   yes    no
2:  A   yes    no
3:  A    no   yes
4:  C   yes   yes
 

Ответ №3:

С помощью base R

 subset(df, ave(cond1 == 'yes', ID, FUN = any) amp;
            ave(cond2 == 'yes', ID, FUN = any))
 

-выход

  ID cond1 cond2
1  A   yes    no
2  A   yes    no
3  A    no   yes
5  C   yes   yes