Mantendo apenas determinadas linhas de um quadro de dados com base em um conjunto de valores

Eu tenho um quadro de dados com uma coluna de ID e algumas colunas para valores. Gostaria de manter apenas algumas linhas do quadro de dados com base no fato de o valor de ID nessa linha corresponder ou não a outro conjunto de valores (por exemplo, chamado "keep").

Por simplicidade, aqui está um exemplo:

df <- data.frame(ID = sample(rep(letters, each=3)), value = rnorm(n=26*3))
keep <- c("a", "d", "r", "x")

Como posso criar um novo quadro de dados que consiste em linhas que possuem apenas IDs que correspondem às de keep? Eu posso fazer isso por apenas uma letra usando owhich()&nbsp;função, mas com várias letras recebo mensagens de aviso e retornos incorretos. Eu sei que eu poderia executar um loop for através do data frame e extrapolar dessa maneira, mas eu estou querendo saber se existe uma maneira mais elegante e eficiente de fazer isso. Desde já, obrigado.