1

一意のIDと年の2つのデータフレームをマージしようとしています。SQL言語では、左外部結合を実行しようとしているため、マージではall.x=TRUEになります。yデータフレームの一部の要素には、x DFのすべての値(一意のID、年の組み合わせ)がありません。一致が欠落している場合は、xデータフレームと同じ一意のIDを持つyデータフレームの行をマージしますが、欠落している前の最初の年を使用します。このマージにアプローチする方法について何か提案はありますか?どうもありがとう!

編集もっと具体的にしたかった

データフレームx:

Id  year    var1 
1   2010    100
1   2011    105
1   2012    110
2   2010    100 
2   2011    105
2   2012    106

データフレームy:

Id  year    var2    var3
1   2010    5       7
1   2011    10      8
2   2010    9       6

必要なマージ:

Id  year    var1    var2    var3
1   2010    100     5       7
1   2011    105     10      8
1   2012    110     10      8
2   2010    100     9       6
2   2011    105     9       6
2   2012    106     9       6
4

2 に答える 2

3

これは2つのステップで行います。

> out <- merge(x, y, all.x=T)
> out
  Id year var1 var2 var3
1  1 2010  100    5    7
2  1 2011  105   10    8
3  1 2012  110   NA   NA
4  2 2010  100    9    6
5  2 2011  105   NA   NA
6  2 2012  106   NA   NA

次にna.locfzooパッケージから使用します。

library(zoo)

> apply(out, 2, na.locf)
     Id year var1 var2 var3
[1,]  1 2010  100    5    7
[2,]  1 2011  105   10    8
[3,]  1 2012  110   10    8
[4,]  2 2010  100    9    6
[5,]  2 2011  105    9    6
[6,]  2 2012  106    9    6

これは、data.frameに簡単に強制変換できます。

> as.data.frame(apply(out, 2, na.locf))
  Id year var1 var2 var3
1  1 2010  100    5    7
2  1 2011  105   10    8
3  1 2012  110   10    8
4  2 2010  100    9    6
5  2 2011  105    9    6
6  2 2012  106    9    6
于 2012-04-12T19:57:59.503 に答える
1

これはを使用しませんmergeが、一度に1つの行をループして、xで適切な一致を見つけますy。おそらく効率的ではありませんが、機能します。

do.call(rbind,
  lapply(seq(length=nrow(x)), function(r) {
    yid <- y[y$Id==x$Id[r],]
    yeardiff <- x$year[r] - yid$year
    yeardiff[yeardiff < 0] <- NA
    cbind(x[r,], yid[which.min(yeardiff),])
}))

結果は

  Id year var1 Id year var2 var3
1  1 2010  100  1 2010    5    7
2  1 2011  105  1 2011   10    8
3  1 2012  110  1 2011   10    8
4  2 2010  100  2 2010    9    6
5  2 2011  105  2 2010    9    6
6  2 2012  106  2 2010    9    6
于 2012-04-12T20:10:40.760 に答える