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 == 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