2016-05-06 1 views
2

私は長い形式のdata.frameを持っています。私は幅広く形を変えたいが、列の順序が気になる。長さから幅に変換しますが、列見出しをグループ化してください

ここはおもちゃの例です。実際には、もっと多くのグループ(grp)があります。

# Minimum working example 

mwe <- "grp mean sd label 

1 C90 90 19 Heart_rate 
2 D20 86 18 Heart_rate 
3 H09 80 16 Heart_rate 
9 Z89 89 18 Heart_rate" 

# Read in the text data 

dd <- read.table(text=mwe, header=TRUE) 

私はthisを試してみましたが、成功しませんでした。私が欲しいもの

dcast(setDT(dd), label~grp, value.var=list("mean", "sd"), sep="_") 

    label mean_C90 mean_D20 mean_H09 mean_Z89 sd_C90 sd_D20 sd_H09 sd_Z89 
1: Heart_rate  90  86  80  89  19  18  16  18 

この

label mean_C90 sd_C90 mean_D20 sd_D20 mean_H09 sd_H09 mean_Z89 sd_Z89 

のように、私はこだわっています... meansdによって、その後grplabel後の列です!

答えて

7

meansdの値が同じ列になるようにあなたは、最初ddを溶融する必要があります

dcast(melt(dd), label ~ grp + variable) 
#  label C90_mean C90_sd D20_mean D20_sd H09_mean H09_sd Z89_mean Z89_sd 
#1 Heart_rate  90  19  86  18  80  16  89  18 
+0

溶けているのはdata.tableかreshape2ですか? – drstevok

+0

これは両方のパッケージに含まれています – mtoto

3

これを解決する1つの簡単な方法はsetcolorderを使用して、その後、列を再配置することです:

  • gsub("^(mean|sd)_", "", names(temp)[-1])プリントアウト名の:

    setcolorder(temp, c("label", paste(c("mean","sd"), 
          rep(unique(gsub("^(mean|sd)_", "", names(temp)[-1])), each=2), sep="_"))) 
    

    これはので、ここで少しコンパクトですが作品です"mean_"と "sd_"が削除された変数( "label"を除く)。この結果は重複する名前を削除するためにuniqueにラップされます。

  • 上記の結果は、each = 2引数でrepに与えられ、2回繰り返されます。
  • これらの繰り返し値は、 "mean_"と "sd_"に貼り付けられて、列の希望の順序を構成します。
  • "label"はこの文字列ベクトルの先頭に連結されます。

setcolorderの良い点は、data.tableのコピーを含まないように、参照によってデータを変更することです(つまり、超高速です)。

+0

ビット単純: 'setcolorder(TEMP、C(1、オーダー(サブ(」。 *)、*)))+1)) – eddi

+0

@eddiこれは確かに読みやすいです。 – lmo

関連する問題