2017-07-03 5 views
1

Ich versuche nicht wirklich einen Datenrahmen per se zu transponieren. Aber ich versuche etwas Ähnliches zu erreichen."Transpose" Datenrahmen ohne For-Loops

Ich habe einen (sehr groß) Datenrahmen der Form:

variable country   iso  2007 2008 2009 2010 2011 2012 2014 
Var1  Argentina  ARG  67.3 65  63.6 60.4 56.6 54.4 57.3 
Var2  Argentina  ARG  196.785 196.918 207.487 209.596 219.171 216.852 213.124 
Var1  Austria   AUT  97.3 95  63.6 60.4 56.6 54.4 57.3 
Var2  Austria   AUT  296.785 396.918 207.487 209.596 219.171 216.852 213.124 

und so weiter für viele Variablen, Jahre und Länder.

Ich möchte es in Form zu bekommen:

country iso year Var1 Var2
Argentina ARG 2007 67.3 196.785
Argentina ARG 2008 65 196.918
.
.
Austria AUT 2007 97.3 296.785
Austria AUT 2008 95 396.918

und so weiter ..

Gibt es eine saubere Möglichkeit, dies zu tun, ohne auf for-Schleifen etc. ??

Ich denke, es muss eine Variation der dplyr merge Funktion, die dies erreichen kann, aber ich kann nicht scheinen, nichts zu finden.

Antwort

2

tidyr kann dies für Sie tun. Verwenden Sie gather und spread. Es lohnt sich sehr auf diese beiden sehr gut, besuchen Sie das Beispiel lernen:

library(tidyr) 

df1 <- data.frame(
    variable = c("Var1", "Var2", "Var1", "Var2"), 
    country = c("Argentina", "Argentina", "Austria", "Austria"), 
     iso = c("ARG", "ARG", "AUT", "AUT"), 
     X2007 = c(67.3, 196.785, 97.3, 296.785), 
     X2008 = c(65, 196.918, 95, 396.918), 
     X2009 = c(63.6, 207.487, 63.6, 207.487), 
     X2010 = c(60.4, 209.596, 60.4, 209.596), 
     X2011 = c(56.6, 219.171, 56.6, 219.171), 
     X2012 = c(54.4, 216.852, 54.4, 216.852), 
     X2014 = c(57.3, 213.124, 57.3, 213.12) 
) 

df1 %>% gather(Year, Value, -c(variable:iso)) %>% 
     spread(variable, Value) 

Read-up die Vignette besser in den Griff zu bekommen, wie es funktioniert.

+0

Das hat gut funktioniert, danke! – jackson5