Convert R-Datenframe vom Lang- zum Breitformat, jedoch mit ungleicher Gruppengröße, zur Verwendung mit qcc
Ich möchte einen Datenrahmen vom Langformat in ein Breitformat konvertieren, aber mit ungleichen Gruppengrößen.
Die spätere Verwendung erfolgt in 'qcc', was einen Datenrahmen oder eine Matrix erfordert, wobei jede Zeile aus einer Gruppe besteht, wobei NAs in Gruppen mit weniger Abtastwerten verwendet werden.
Der folgende Code erstellt einen Beispieldatensatz und zeigt die manuelle Konvertierung in das gewünschte Format.
# 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))
Also, ich würde das gerne konvertieren:
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
... dazu ...
[,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
Es gibt wahrscheinlich einen einfachen Weg (vielleicht eine Verwendung von Reshape oder Reshape2-Casting, die ich nicht kenne?), Aber ein paar Suchanfragen haben mir bisher nicht geholfen.
Vielen Dank für jede Hilfe!
==========
Aus einer der folgenden Lösungen wird das endgültige qcc xbar-Diagramm einschließlich der Gruppenbezeichnungen erstellt:
library(splitstackshape)
out_df <- dcast( getanID( x_df, 'time' ), time~.id, value.var='measure' )
qcc( out_df[,-1], type = 'xbar', labels = out_df[,1] )