R сравнить с двумя кадрами данных по нескольким условиям, чтобы извлечь строки - PullRequest
0 голосов
/ 06 марта 2020

У меня есть два кадра данных:

 x <- data.frame('a'=c(1,1,2,2,3,3),'b'=c(1,2,1,2,1,2),'c'=c(1,2,3,2,1,3))

    y <- data.frame('a'=c(1,2,3),'b'=c(1,1,1),'c'=c(1,2,3))

хотел бы извлечь строки из x в соответствии с условиями:

 x$a==y$a & x$b==y$b+1 & (if y$c == 1, then x$c %in% c(2,3); if ...)

результат должен выглядеть так: x: ab c 1 2 2 только строка 2 в х совпадает. Я попытался:

 z <- y[which(y$a == x$a & y$b == x$b+1),] 

, чтобы сопоставить в аренду первые два условия, но не работает, результат равен нулю. Каков подходящий способ борьбы с этим? Пожалуйста, помогите.

Ответы [ 2 ]

1 голос
/ 06 марта 2020

Возможно, вы можете попытаться запустить оператор SQL с помощью sqldf:

sqldf("select x.* from x join y where 
      x.a = y.a and 
      x.b = y.b + 1 and
      y.c = 1 and
      x.c in (2, 3)")
  a b c
1 1 2 2

Это возвращает ожидаемый результат для данного образца набора данных , Однако его необходимо проверить с помощью набора производственных данных.

Третье и четвертое условие являются «фиксированными», например, y$c == 1 и x$c %in% c(2, 3). Таким образом, x и y могут быть отфильтрованы до присоединения :

sqldf("select u.* from 
      (select * from x where c in (2, 3)) as u
      join 
      (select * from y where c = 1) as v
      where u.a = v.a")
  a b c
1 1 2 2

Возможно, это может привести к увеличению производительности (непроверенный !)

Этот подход также можно использовать в dplyr:

library(dplyr)
x %>% 
  filter(c %in% 2:3) %>% 
  inner_join(
    y %>% 
      filter(c == 1) %>% 
      mutate(bp1 = b + 1), 
    by = c("a", "b" = "bp1"))
  a b c.x b.y c.y
1 1 2   2   1   1
0 голосов
/ 06 марта 2020

Я не знаю, что здесь происходит простое «слияние» (из-за неравенства), но вот попытка:

library(dplyr)
y %>%
  mutate(bp1 = b + 1) %>%
  inner_join(x, ., by = c("a", "b" = "bp1")) %>%
  filter(c.y == 1 & c.x %in% c(2, 3))
#   a b c.x b.y c.y
# 1 1 2   2   1   1

Примечание: .x и .y равны по совпадению то же самое, что и кадр, из которого они пришли, но это просто совпадение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...