27359
Rでパネルデータを扱っているのですが、データフレームで

```

    ID　Q1　Q3　Q6　Q8　Q11　Q13　Q16　Q18　Q33 Q34 Q128 Q137 …
    1    1  22   3  32   NA   NA   NA   NA
    1    1  23   3  33    7    4   NA   NA
    1    …
    2    2  27   5   8
    2    2  28   5   9
    2
    2
    2
    2
    2
    3
    4
    4
    5
    5
    5
    5
    5
    7
    7
    
```

のようになっています。  
Q1とQ3、Q6とQ8、…は同じ個体です。前者が属性、後者が年齢です。  
またQ18のあとの…は他のデータが入っています。  
この時、IDごとに属性1のデータだけ、属性3のデータだけ、…を抽出するにはどのようにしたらよいでしょうか？  
属性1が含まれるデータ全て、属性1が含まれるデータのうち最新のものだけ、どちらも知りたいですが後者のほうがより重要です。  
よろしくお願い致します。

**追記**  
dplyrでselectを使ったり一度Q1,Q3とかQ6,Q8でまとめて処理後に分解するとかIDでinner
joinして後でtydirでバラすとか考えましたがどれもうまくいきそうにないので悩んでいます。  
また、Q18以降のカラムにはたくさんデータが入っています。（型は整数でNAもあります）

欲しいデータは以下の様な感じです。numが条件です。yearが年齢です。

```

    ID num year Q33 Q34 Q128 Q137 ...
    1    1   24  22  99   45    6
    4    1   36  22  99   NA    2
    5    1   14  48   0   77    7
    7    1   24  24   0   52    1
    22   1   30  22  99   32    6
     ...
    
```

**再追記**  
sqldfを使ってSQL形式で同じ処理ができないか、という方向で考えています。  
良い知恵のある方よろしくお願い致します。

**データ例**

```

    ID,Q1,Q3,Q6,Q8,Q11,Q13,Q16,Q18,Q33,Q34,Q128,Q137,Q299
    50,1,39,2,14,3,12,8,68,5,0,90,90,0
    50,1,40,2,15,3,13,8,69,7,0,84,84,0
    50,1,16,NA,NA,NA,NA,NA,NA,9,0,100,100,0
    51,1,38,2,13,3,12,NA,NA,4,3,0,0,0
    51,1,39,2,14,3,13,NA,NA,7,0,36,36,0
    51,1,40,2,15,NA,NA,NA,NA,6,0,59,59,0
    51,1,41,2,16,3,15,NA,NA,7,0,86,86,0
    51,1,42,2,17,3,16,NA,NA,6,0,80,80,0
    52,1,40,2,13,3,7,NA,NA,0,0,0,0,0
    52,1,41,2,14,3,8,NA,NA,0,0,0,0,0
    53,1,34,2,5,3,5,8,59,0,0,0,0,0
    53,1,35,2,6,3,6,8,60,4,0,0,0,0
    
```

Q1は全て1に見えますが他の個体で2や6から始まるものもあります。  
そのため、1のデータだけ、2のデータだけ欲しくてもカラムごとに条件設定できず困っています。  
2のカラムとその右隣のカラムのみ残せる、もしくはdplyrのmutateでQ1~Q18の中で  
属性1のものとその年齢を右につけるパターンを現在考え中です。知恵のある方、ヘルプお願い致します。
CC BY-SA 3.0
2016-06-28T11:38:06.310
27140
2016-07-05T09:24:05.960
2016-07-04T07:41:53.300
12457
12457
question
sql r
パネルデータにおけるIDごとの抽出
一応自己解決したので記載します。2のデータのみを抽出するコードです。  
汚いコードなのでもっとスマートな書き方があればご教示お願い致します。

```

    library(data.table)
    ex <- fread("ex.csv") 
    %>% filter(Q11 == 2|Q16 == 2|Q1 == 2|Q6 == 2)
    %>% mutate(2) %>% 
    mutate(year = ifelse(Q1==2, Q3, ifelse(Q6==2, Q8, ifelse(Q11==2, 
    Q13,ifelse(Q16==2,Q18,NA)))))
    
```
CC BY-SA 3.0
2016-07-05T09:24:05.960
27359
2016-07-05T09:24:05.960
12457
27140
answer