2017-11-20 1 views
0

Ich habe einen großen Datenrahmen mit 41040 Obs. und 20 Variablen. Hier werde ich den Mock-Datensatz vereinfachen, so dass es einfacher ist, die Frage zu verstehen.Umstrukturierung kompliziert und großen Datenframe

Was ich habe:

rm(list = ls()) 

variable <- rep(c('var1', 'var1_2', 'var1_3', 'var1_4'), 5) 
group <- as.factor(rep(c('county1', 'county2', 'county3', 'county4'), 5)) 
year <- rep(c(2000:2004), 4) 
month <- c(rep(1:12, 1), 1:8) 

value1 <- sample(1:10000, 20) 
value2 <- sample(1:10000, 20) 
value3 <- sample(1:10000, 20) 


mydata <- data.frame(variable, group, year, month, value1, value2, value3) 

head(mydata) 

    variable group year month value1 value2 value3 
1  var1 county1 2000  1 4848 4759 6029 
2 var1_2 county2 2001  2 7624 3486 6745 
3 var1_3 county3 2002  3 4612 9155 4266 
4 var1_4 county4 2003  4 1496 2420 9451 
5  var1 county1 2004  5 6739 4312 5577 
6 var1_2 county2 2000  6 5127 5030 5479 

Was ich von dieser wollen, ist eine andere data.frame bekommen, wo Werte nicht über Landkreise, Jahre oder Monate vermasselt, aber jede Spalte repräsentieren eine Variable aus die variable Spalte. Um zu klären, auf dem gleiche Beispiel, das ich für den schnellsten Weg suche diese zu bekommen:

var1 <- c(t(mydata[1, 5:7])) 
var1_2 <- c(t(mydata[2, 5:7])) 
var1_3 <- c(t(mydata[3, 5:7])) 
var1_4 <- c(t(mydata[4, 5:7])) 

group2 <- rep('county1', 3) 
year2 <- rep(2000, 3) 
month2 <- rep(1, 3) 

mydata2 <- data.frame(group2, year2, month2, var1, var1_2, var1_3, var1_4) 

head(mydata2) 

group2 year2 month2 var1 var1_2 var1_3 var1_4 
county1 2000  1 4848 7624 4612 1496 
county1 2000  1 4759 3486 9155 2420 
county1 2000  1 6029 6745 4266 9451 

Nachdem alle Werte für county1, Jahr 2000 und Monat 1 geschrieben werden, ich mag es Monat 2, Jahr 2000 gehen und county1, als Monat 3 usw. Nachdem alle Monate fertig sind, will ich das Jahr 2001 für County 1 usw., und am Ende Umzug nach county2.

Ich versuchte verschiedene Möglichkeiten mit melt(), dcast(), stack(), unstack(), gather() and spread() ohne Erfolg.

Antwort

0

Ich tat es, aber nicht super-elegant. Ich habe den ursprünglichen data.frame in neue data.frames aufgeteilt, indem ich die ersten 4 Variablen ausgewählt und dann die folgenden Variablen, die umgewandelt werden mussten, abwechselnd ausgewählt habe. Wie folgt aus:

res <- select(mydata, c(1:4, 5)) # i changed this 5 to 6, than to 7 etc. 
base <- dcast(res, group + year + month ~ variable, value.var = 'value1') 

nachdem ich tat dies für jede Spalte, benutzen ich cbind einen neuen, gegossen Datenrahmen zu erstellen:

cbind(base, var1_2[ , 5:14], var1_3[ , 6:14]) 

Es funktioniert, obwohl ich immer noch eine schönere Art und Weise sehen mochte mach das automatisch in ein oder zwei Zeilen.