2009-08-19 2 views
4

注:最初に投稿したときの例を変更しました。私の最初の例は、実際の問題を捉えるにはあまりに単純すぎた。R - 下付きソリューションの混在?

私は1つの列で異なってソートされる2つのデータフレームを持っています。私は1つの列を一致させて、2番目の列の値をマージしたい。 2番目の列は同じ順序にとどまる必要があります。

だから私はこれを持っている:

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

私が解決しようとする愚かな自分自身を駆動する程度だ
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 

この。シンプルな添え字の問題であるように思えます。

+1

この例はどのように玩具ですか?インスタンスの場合、この場合、状態IDは常に同じ値1(IA == 2、IL == 1)と一致します。したがって、状態IDがソートされていれば、順序は関係ありませんs1と同じでした。 value1が1:6と言うと、それはまったく違うことです。 – geoffjentry

+0

非常に良い点。私は私の例を単純化しました。 IAは必ずしも== 2ではないので、あまりにも単純です。私は私の質問を編集します。 –

答えて

3

これを行うにはいくつかの方法がありますが(結局のところ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)) 

(環境/データフレーム内の変数を検索するためのRを伝えwithの使用を注意してください。これは、S1 $値1、S2の$値2などを使用してより良い習慣です) 2つのデータフレーム(状態とインデックスの両方のデータフレームに存在する変数によって)を単にマージ(結合)することができます。仕事このため

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 

を与える

merge(s1,s2) 

、データフレームの各々における状態によって観測の同じ数があるべきです。

[編集:明確にするためのコードをコメントしています。] [編集:代わりに、ハドレーにより示唆されるように新しい関数を作成するのに使用されseq_len。]

+1

無限の数の猿と無限の数のコンピュータがあれば、それでも私はそれを思い付くことができませんでした。ありがとうございました! –

+0

3行ではどうなっていますか?少し詳しく説明できますか? –

+1

'FUN = function(x)1:length(x))'を 'seq_len'に置き換えることができます – hadley

0

注:上記の答えに第五のコメントを確認してください。ソリューションは

s1$index <- with(s1,ave(value1,state,FUN=seq_along)) 
s2$index <- with(s2,ave(value2,state,FUN=seq_along)) 

である必要があります。

関連する問題