2016-06-13 7 views
1

長いデータセットから広いデータセットに変更するのが好きです。具体的には、新しいワイドデータセットは、ロングデータセット内の一意のID番号に対応する行で構成され、列数は別の変数の一意の値の倍数になります。R長い部分から長い部分までの部分的な形状変更データ

のは、これは元のデータセットであるとしましょう:新しいデータセットで

ID a b C d e f g 
1 1 1 1 1 2 3 4 
1 1 1 2 5 6 7 8 
2 2 2 1 1 2 3 4 
2 2 2 3 9 0 1 2 
2 2 2 2 5 6 7 8 
3 3 3 3 9 0 1 2 
3 3 3 2 5 6 7 8 
3 3 3 1 1 2 3 4 

は、行の数は、IDの数、列の数は3であるプラスC変数で見つかったユニークな要素の倍数であります変数dgの値は、変数Cを昇順でソートした後に入力されます。ちょうどあなたの時間変数としてCを使用する必要がありますし、離れてあなたが行く -

data.table::setDT(df) 
data.table::dcast(df, ID + a + b ~ C, sep = "", value.var = c("d", "e", "f", "g"), fill=NA) 

    ID a b d1 d2 d3 e1 e2 e3 f1 f2 f3 g1 g2 g3 
1: 1 1 1 1 5 NA 2 6 NA 3 7 NA 4 8 NA 
2: 2 2 2 1 5 9 2 6 0 3 7 1 4 8 2 
3: 3 3 3 1 5 9 2 6 0 3 7 1 4 8 2 

答えて

3

あなたはdata.tableからdcastを使用することができます。それは次のようになります。

reshape(dat, idvar=c("ID","a","b"), direction="wide", timevar="C", sep="") 
# ID a b d1 e1 f1 g1 d2 e2 f2 g2 d3 e3 f3 g3 
#1 1 1 1 1 2 3 4 5 6 7 8 NA NA NA NA 
#3 2 2 2 1 2 3 4 5 6 7 8 9 0 1 2 
#6 3 3 3 1 2 3 4 5 6 7 8 9 0 1 2 
+1

変数 'C'の値に従ってデータを昇順に取り込む方法はありますか?その部分は除外されました。 –

+0

これを行うには単純な方法はありませんでしたが、列名を数字で並べ替えることはできます。たとえば、次のようになります。 'c(names(dt)[1:3]、names(dt)[3:15] [order(str_extract(names(dt)[3:15]、" \\ d + "))]) [1]「a」「b」「d1」「e1」「f1」「g1」「d2」「e2」「f2」「g2」「d3」「e3」「f3」「g3」「b」 ""を選択し、この順に列を選択します。 – Psidom

3

ベースreshapeバージョンは:

ID a b d1 e1 f1 g1 d2 e2 f2 g2 d3 e3 f3 g3 
1 1 1 1 2 3 4 5 6 7 8 NA NA NA NA 
2 2 2 1 2 3 4 5 6 7 8 9 0 1 2 
3 3 3 1 2 3 4 5 6 7 8 9 0 1 2 
関連する問題