2017-12-14 4 views
0

Note unterscheidet sich diese von der Frage „How to reshape data from long to wide format?“ auf 2 Arten:tibble Gestaltung eines Faktors verteilen sich auf mehrere Variablen Reihen ausklammern zu

  1. Es gibt eine Vielzahl von Zielspalten von der einzelnen qualifiziert werden Faktor Spalte.
  2. Der Titel dieser Frage angegeben "tibble", was bedeutet tidyverse Lösungen sind bevorzugt.

Executing:

set.seed(14) 
df <- data.frame(geo = LETTERS[1:2], time = c(2000,2000,2001,2001), 
        X = rnorm(4, 0, 1), 
        Y = rnorm(4, 0, 2)) 
head(df) 

produziert so etwas wie:

geo time   X   Y 
1 A 2000 -0.6618498 -0.07228116 
2 B 2000 1.7189542 2.46389035 
3 A 2001 2.1216670 -0.12976154 
4 B 2001 1.4971537 2.13798746 

Was ich will ist für geo mit Werten zu spreadtime und am Ende mit zwei Reihen tun umformen: A und B .

Dies würde produzieren so etwas wie:

geo   X.2000   Y.2000   X.2001   Y.2001 
    A  -0.6618498  -0.07228116  2.1216670  -0.12976154 
    B  1.7189542  2.46389035  1.4971537  2.13798746 
+0

In der Basis R, 'Umformen (df, Richtung =" wide ", idvar =" geo ", timevar =" Zeit ")'. Mit dem 'tidyverse' müssen Sie sich" versammeln "," vereinigen "und dann" verbreiten ". 'dcast' von" data.table "auf einer' data.table' kann dies auch tun, ohne zuerst die Daten zu "schmelzen". – A5C1D2H2I1M1N2O1R2T1

+1

Mögliches Duplikat von [Wie umformatieren Sie Daten vom Long- in das Wide-Format?] (Https://stackoverflow.com/questions/5890584/how-to-reshape-data-from-long-to-wide-format) –

+0

Nicht wert eine Antwort, aber der Vollständigkeit halber, 'data.table :: dcast (as.data.table (df), geo ~ time, value.var = c (" X "," Y "))'. – A5C1D2H2I1M1N2O1R2T1

Antwort

2

Der ordentlich Ansatz wollen ist:

library(tidyr) 
library(dplyr) 

df %>% 
    gather(key, value, -c(geo, time)) %>% 
    unite(key, c(key, time), sep = ".") %>% 
    spread(key, value) 

# geo  X.2000 X.2001  Y.2000  Y.2001 
# 1 A -0.6618498 2.121667 -0.07228116 -0.1297615 
# 2 B 1.7189542 1.497154 2.46389035 2.1379875 
+0

@ A5C1D2H2I1M1N2O1R2T1, ganz richtig, werde ich bearbeiten –

+0

Wie ich 'tibble' im Titel der Frage angegeben, wird 'tidyverse' bevorzugt. – user3673

+0

Leider ändert diese Lösung alle gespreizten Spaltenklassen in "Zeichen", wenn einige nicht mit "numerisch" übereinstimmen. – user3673

0

Wir reshape Funktion

reshape(df, direction = "wide", idvar = "geo", timevar = "time") 

verwenden können, und es gibt uns die Ergebnisse, die Sie

geo  X.2000  Y.2000 X.2001  Y.2001 
1 A -0.6618498 -0.07228116 2.121667 -0.1297615 
2 B 1.7189542 2.46389035 1.497154 2.1379875 
Verwandte Themen