4

注: 最初に投稿したときから例を変更しました。私の最初の例は単純すぎて実際の問題を捉えることができませんでした。

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

私はこれを解決しようとして愚かな自分を運転しようとしています。単純な添え字の問題のようです。

4

2 に答える 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 $ value1、s2 $ value2などを使用するよりも優れた方法です。)

これで、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

これが機能するためには、各データフレームに状態ごとに同じ数の観測値が存在する必要があります。

[編集:わかりやすくするためにコードにコメントを付けました。] [編集:hadleyによって提案されたように、新しい関数を作成する代わりにseq_lenを使用しました。]

于 2009-08-19T20:05:46.953 に答える
0

注:上記の回答の5番目のコメントを確認してください。解決策は

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

テストされ、動作しています。

于 2011-03-21T02:38:25.510 に答える