Rは、行を抽出する複数の条件で2つのデータフレームと比較します

ahai:

私は2つのデータフレームを持っています:

 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:ABC 1 2 2 xのみの一致で2行。私が試してみました:

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

リースで最初の2つの条件ではなく、仕事に一致するように、結果はNULLです。それに対処するための適切な方法は何ですか?助けてください。

ウーヴェ:

おそらく、あなたはの助けを借りて、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 == 1x$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

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=29136&siteId=1