3

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

df1 = data.frame(Sites=c("A","B","C"),total=c(12,6,35))

df2 = data.frame(Site.1=c("A","A","B"),Site.2=c("B","C","C"), Score=c(60,70,80))

それらをマージしてデータフレームを生成する必要があります

df3=data.frame(Site.1=c("A","A","B"),Site.2=c("B","C","C"),
Score=c(60,70,80),Site.1.total=c(12,12,6),Site.2.total=c(6,35,35))

このような二重マージを行う最も簡単な方法について何かアドバイスはありますか? ありがとう

4

2 に答える 2

4

単純にmerge2 回:

x <- merge(df2, df1, all.x=TRUE, by.x="Site.2", by.y="Sites", sort=FALSE)
merge(x, df1, all.x=TRUE, by.x="Site.1", by.y="Sites", sort=FALSE)

  Site.1 Site.2 Score total.x total.y
1      A      B    60       6      12
2      A      C    70      35      12
3      B      C    80      35       6
于 2012-07-12T08:58:04.943 に答える
1

以下に、いくつかの sqldf ソリューションを示します。

最初に、名前にドットを含む列の名前を変更して、ドットを削除します。これは、ドットが SQL 演算子であるためです。(そうしたくない場合は、SQL ステートメントでこれらの列を and として参照できたのでSite_1、andSite_2を参照していると認識されたはずです。)Site.1Site.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
于 2012-07-12T09:12:06.943 に答える