Подвыделить в dplyr - PullRequest
1 голос
/ 09 мая 2020

Я ищу dplyr-эквивалент следующего SQL:

SELECT x
FROM ABT1
WHERE x IN (SELECT z FROM ABT2 WHERE q = ABT1.q)

Мне это нужно, чтобы можно было добавить новый столбец в кадр данных на основе значений в другом кадре данных. Возможно, я делаю это неправильно (надеюсь, вы мне скажете), но идея, которая у меня есть, заключается в следующем:

ABT1 <- ABT1 %>% mutate(x = ifelse(ABT2 %>% filter(x = ABT1.x) %>% count() > 0, 0, 1))

Приведенный выше код не работает, поскольку я не знаю, как фини sh ит. ABT1 и ABT2 являются фреймами данных.

Кто-нибудь знает, как я могу решить эту проблему?

1 Ответ

2 голосов
/ 09 мая 2020

С помощью dplyr мы можем выполнить

library(dplyr)
inner_join(ABT1, select(ABT2, q, z), by = 'q') %>%
       filter(x %in% z) %>%
       select(x) %>%
       distinct()
#  x
#1 4
#2 3

-тестирование с помощью sqldf

library(sqldf)
sqldf('SELECT x
 FROM ABT1
 WHERE x IN (SELECT z FROM ABT2 WHERE q = ABT1.q)')
#  x
#1 4
#2 3

data

ABT1 <- data.frame(q = rep(letters[1:3], each = 2), x  = c(1, 3, 5, 2, 4, 3))
ABT2 <- data.frame(q = rep(letters[2:4], each = 3),
           z = c(4, 9, 12, 3, 1,  4, 10, 6, 5))
...