#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