Насколько я понимаю, вы хотите взять подмножество строк таким образом, чтобы, если какая-либо строка для идентификатора имела Involuntarily
в столбце DrugChange
, все строки для этого идентификатора должны быть исключены, как в примере в примечании. в конце все строки для идентификатора 1 будут исключены, а все строки для идентификатора 2 будут сохранены.
1) оконная функция Использование тестовых данных в примечании в конце и SQL оконная функция создает столбец ok
, который равен 1 для каждой строки идентификатора, не имеющего Involutarily
в столбце DrugChange
, а затем выбирает только эти строки. Мы удалили столбец ok
, но если вы хотите, опустите [-1].
library(sqldf)
sqldf("select * from (
select not max(DrugChange = 'Involuntarily') over (partition by ID) ok, *
from df
) where ok")[-1]
, что дает:
DrugChange ID
1 X 2
2 X 2
1a) Это может быть записано в терминах CTE, например:
sqldf("with inner as (
select not max(DrugChange = 'Involuntarily') over (partition by ID) ok, *
from df
)
select * from inner where ok")[-1]
2) join Альтернативный подход заключается в создании одной строки для каждого идентификатора со значением ok и затем присоединении к df
если все в порядке 1.
sqldf("select a.*
from df a join (select ID, not max(DrugChange = 'Involuntarily') ok
from df
group by ID) b on a.ID = b.ID and b.ok")
, что дает:
DrugChange ID
1 X 2
2 X 2
2a) Мы также можем написать это в терминах CTE:
sqldf("with right as (
select ID, not max(DrugChange = 'Involuntarily') ok
from df
group by ID
)
select a.* from df a join right b on a.ID = b.ID and b.ok")
3) в Другой подход заключается в использовании in
, как показано здесь:
sqldf("select *
from df
where id not in (select distinct id from df where DrugChange = 'Involuntarily')")
, давая:
DrugChange ID
1 X 2
2 X 2
Это также будет работать без ключевого слова distinct
.
3a) Мы также можем написать его с помощью CTE:
sqldf("with ids as (
select distinct id from df where DrugChange = 'Involuntarily'
)
select * from df where id not in ids")
Примечание
Test использованные данные.
df <- data.frame(DrugChange = c("Involuntarily", "X", "X", "X"), ID = c(1,1,2,2))