質問
注:のの私は、私が最初に掲載されてからの例を変更しました。私の最初の例では、あまりにも現実的な問題をキャプチャするために簡素化されました。の
私は1つのカラムでは異なるソートされている2つのデータフレームを持っています。私は1つの列にマッチした後、第2列の値にマージしたいです。 2番目の列は同じ順序で滞在する必要があります。
だから私はこれを持っています:
state<-c("IA","IA","IA","IL","IL","IL")
value1<-c(1,2,3,4,5,6)
s1<-data.frame(state,value1)
state<-c("IL","IL","IL","IA","IA","IA")
value2<-c(3,4,5,6,7,8)
s2<-data.frame(state,value2)
s1
s2
この返します:
> s1
state value1
1 IA 1
2 IA 2
3 IA 3
4 IL 4
5 IL 5
6 IL 6
> s2
state value2
1 IL 3
2 IL 4
3 IL 5
4 IA 6
5 IA 7
6 IA 8
と、私はこれが欲しいます:
state value1 value2
1 IA 1 6
2 IA 2 7
3 IA 3 8
4 IL 4 3
5 IL 5 4
6 IL 6 5
私はこの問題を解決しようとする愚かな自分自身を駆動する程度です。それは、単純な添字の問題でなければなりませんように思えます。
解決
これを行うには、いくつかの方法(それは結局、Rである)がありますが、私は最も明確なインデックスを作成していると思います。私たちは、シーケンシャルインデックス(1から始まり、観測数で終わる)を作成機能を必要とします。
seq_len(3)
> [1] 1 2 3
しかし、私たちは、各グループ化変数(状態)の中に、この指数を計算する必要があります。このために我々はRのave
機能を使用することができます。次にグループ化因子、最初の引数として数値を取り、最後に関数が各グループに適用されます。
s1$index <- with(s1,ave(value1,state,FUN=seq_len))
s2$index <- with(s2,ave(value2,state,FUN=seq_len))
(これは、S1の$値1、S2の$値2、などを使用してより良い習慣です環境/データフレーム内の変数を検索するためのRを伝えwith
の使用は、注意してください。)
今、私たちは、単に(:状態とインデックスデータフレームの両方に存在する変数で)(参加)2つのデータフレームをマージすることができます。
merge(s1,s2)
タグ与えます
state index value1 value2
1 IA 1 1 6
2 IA 2 2 7
3 IA 3 3 8
4 IL 1 4 3
5 IL 2 5 4
6 IL 3 6 5
これが機能するために、、データフレームの各状態による観察の同じ数があるべきである。
[編集:明確にするためのコードをコメントしました。】 [編集:使用seq_lenの代わりに、ハドレーにより示唆されるように新しい関数を作成する。
他のヒント
注:上記の答えに第五のコメントを確認してください。ソリューションでなければなりません。
s1$index <- with(s1,ave(value1,state,FUN=seq_along))
s2$index <- with(s2,ave(value2,state,FUN=seq_along))
テストおよびワーキングます。