2012-05-12 2 views
2

IDと列のデータファイルは、IDと週番号のサブセットとサンプルファイルがありY1、Y2、...選択した値に従って、列番号

> dat 
    id y1 y2 y3 y4 y5 
1 1 2 4 2 3 4 
2 2 4 1 1 4 4 
3 3 2 3 1 3 1 
4 4 0 1 2 4 4 
5 5 3 3 2 1 4 
6 6 4 1 3 1 4 
7 7 2 4 4 4 0 
8 8 2 5 0 2 5 
9 9 2 2 3 3 1 
10 10 0 3 4 4 3 

があります。

> sam 
    id week 
1 2 3 
2 4 4 
3 6 4 
4 7 5 
5 8 5 

私は週数による各サンプリングされたIDにdatからy値を割り当てます。これは私が達成したい結果です:

> res 
    id y 
1 2 1 
2 4 4 
3 6 1 
4 7 0 
5 8 5 

いくつかのループで結果を達成することは可能ですが、可能であれば避けたいと思います。

datおよびsamの構造。

dat <- structure(list(id = 1:10, 
    y1 = c(2, 4, 2, 0, 3, 4, 2, 2, 2, 0), 
    y2 = c(4, 1, 3, 1, 3, 1, 4, 5, 2, 3), 
    y3 = c(2, 1, 1, 2, 2, 3, 4, 0, 3, 4), 
    y4 = c(3, 4, 3, 4, 1, 1, 4, 2, 3, 4), 
    y5 = c(4, 4, 1, 4, 4, 4, 0, 5, 1, 3)), 
    .Names = c("id", "y1", "y2", "y3", "y4", "y5"), 
    row.names = c(NA, -10L), 
    class = "data.frame") 

sam <- structure(list(id = c(2L, 4L, 6L, 7L, 8L), 
    week = c(3L, 4L, 4L, 5L, 5L)), 
    .Names = c("id", "week"), 
    row.names = c(NA, -5L), 
    class = "data.frame") 

答えて

3
data.frame(id = sam[,1], y = dat[cbind(sam[,1],(1+sam[,2]))]) 
+0

私は 'reshape'と' match'などを使って答えを生産し...しかし、私はあなたを見て、何が起こっていると、なぜそれを掲示わざわざ考え出し。この問題に対する非常に巧妙な答え。 +1 –

+0

ありがとう、dat [cbind(1:3、1:3)]のようなcbind()の使い方については知らなかった。非常に便利な答えです。 – djhurio

関連する問題