7

データフレームをロング フォーマットからワイド フォーマットに変換したいのですが、グループ サイズが等しくありません。

最終的には「qcc」で使用されます。これは、サンプルが少ないグループで NA を使用して、各行が 1 つのグループで構成されるデータ フレームまたは行列を必要とします。

次のコードは、サンプル データセットを作成し、目的の形式への手動変換を示します。

# This is an example of the initial data that I have
# * 10 sample measurements, over 3 groups with 3, 2, and 5 elements respectively
x <- rnorm(10)
x_df <- data.frame( time = c( rep('2001 Q1',3), rep('2001 Q2',2), rep('2001 Q3',5) ), measure = x )
x_df

# This is a manual conversion into the desired format
x_pad <- c( x[1:3], NA, NA, x[4:5], NA, NA, NA, x[6:10] )
x_matrix <- matrix( x_pad, nrow = 3, ncol = 5, byrow = TRUE, dimnames = list(c('2001 Q1','2001 Q2','2001 Q3')) )
x_matrix # desired format

# An example of how it will be used
library(qcc)
plot(qcc(x_matrix, type = 'xbar', plot = FALSE))

だから、私はこれを変換したいと思います:

      time     measure
1  2001 Q1  0.14680685
2  2001 Q1  0.53593193
3  2001 Q1  0.56097974
4  2001 Q2 -1.48102689
5  2001 Q2  0.18150972
6  2001 Q3  1.72018147
7  2001 Q3 -0.08480855
8  2001 Q3 -2.23208877
9  2001 Q3 -1.15269107
10 2001 Q3  0.57975023

...これに...

              [,1]        [,2]       [,3]      [,4]      [,5]
2001 Q1  0.1468068  0.53593193  0.5609797        NA        NA
2001 Q2 -1.4810269  0.18150972         NA        NA        NA
2001 Q3  1.7201815 -0.08480855 -2.2320888 -1.152691 0.5797502

おそらく簡単な方法があります (おそらく、私が慣れていない reshape または reshape2 キャストの使用法でしょうか?) が、これまでのところ、多くの検索が役に立ちませんでした。

助けてくれてありがとう!

==========

以下のソリューションの 1 つから、グループ ラベルを含む最終的な qcc xbar プロットが生成されます。

library(splitstackshape)
out_df <- dcast( getanID( x_df, 'time' ), time~.id, value.var='measure' )
qcc( out_df[,-1], type = 'xbar', labels = out_df[,1] )
4

3 に答える 3

7

from を使用してシーケンス列 ('.id') を作成し、getanIDfromsplitstackshapeを使用dcastdata.tableてロング フォーマットをワイド フォーマットに変換できます。の出力splitstackshapeは data.table です。をロードsplitstackshapeすると、data.table もロードされます。そのため、data.table の devel バージョンが既にある場合は、dcastfromdata.tableも使用できます。

library(splitstackshape)
dcast(getanID(df1, 'time'), time~.id, value.var='measure')
#     time          1           2          3         4         5
#1: 2001 Q1  0.1468068  0.53593193  0.5609797        NA        NA
#2: 2001 Q2 -1.4810269  0.18150972         NA        NA        NA
#3: 2001 Q3  1.7201815 -0.08480855 -2.2320888 -1.152691 0.5797502

アップデート

コメントで @snoram が述べたように、関数rowidfromを使用すると、単独でdata.table使いやすくなりますdata.table

library(data.table)
dcast(setDT(df1), time ~ rowid(time), value.var = "measure")
于 2015-07-29T12:20:58.023 に答える
7

「時間内」IDを与える中間変数が必要です。このように作成して形を変えることができます

library(tidyr)
library(dplyr)

group_by(X, time) %>%
  mutate(seq = 1:n()) %>%
  ungroup() %>%
  spread(seq, measure)
于 2015-07-29T12:16:25.123 に答える
5

別のsplitstackshapeアプローチ

cSplit(setDT(df)[, toString(measure), by='time'], 'V1', ',')

#      time       V1_1        V1_2       V1_3      V1_4      V1_5
#1: 2001 Q1  0.1468068  0.53593193  0.5609797        NA        NA
#2: 2001 Q2 -1.4810269  0.18150972         NA        NA        NA
#3: 2001 Q3  1.7201815 -0.08480855 -2.2320888 -1.152691 0.5797502

または、グループ化列「時間」で「メジャー」を貼り付けた後に同様のアプローチのdevelバージョンを使用すると、から生成された「V1」列を分割するために使用されます。data.tabletstrsplittoString(measure)

 setDT(df)[, toString(measure), by ='time'][, c(list(time), tstrsplit(V1, ', '))]

また、分割された列を変換するために追加することもできtype.convert=TRUEます。デフォルトでは です。tstrsplitclassFALSE

于 2015-07-29T12:28:27.287 に答える