以下に、いくつかの sqldf ソリューションを示します。
最初に、名前にドットを含む列の名前を変更して、ドットを削除します。これは、ドットが SQL 演算子であるためです。(そうしたくない場合は、SQL ステートメントでこれらの列を and として参照できたのでSite_1
、andSite_2
を参照していると認識されたはずです。)Site.1
Site.2
library(sqldf)
df1 = data.frame(Sites = c("A","B","C"), total = c(12,6,35))
df2 = data.frame(Site1 = c("A","A","B"), Site2 = c("B","C","C"),
Score = c(60,70,80))
入力ができたので、sqldf を使用していくつかのアプローチを試してみましょう。
3 つの SQL ステートメントを含む sqldf
temp1 <- sqldf("SELECT * FROM df1 as a, df2 as b WHERE a.Sites = b.Site1 ")
temp2 <- sqldf("SELECT * FROM df1 as a, df2 as b WHERE a.Sites = b.Site2 ")
sqldf("SELECT
Site1,
b.Site2,
a.Score,
a.Total as Site1Total,
b.Total as Site2Total
FROM temp1 as a, temp2 as b
USING (Site1)
GROUP BY a.Total, b.Total")
トリプル結合に縮小された sqldf
上記をさらに三重結合に減らすことができ、おそらく計算の本質を明確にすることができます。つまり、上記の 3 つの SQL ステートメントは、次の 1 つのステートメントに減らすことができます。
> sqldf("SELECT Site1, Site2, Score, a1.total AS total1, a2.total AS total2
+ FROM df1 AS a1, df1 a2, df2 AS b
+ WHERE a1.Sites = Site1 AND a2.Sites = Site2")
Site1 Site2 Score total1 total2
1 A B 60 12 6
2 A C 70 12 35
3 B C 80 6 35