2017-07-04 7 views
3

Ich bin neu in R und kämpfe ein wenig mit ihm. Ich habe ein Datenrahmen wie dieseTeile eines Datenrahmens in einzelne Spalten transponieren

reg  12345 
val1 1 
val2 0 
reg  45678 
val1 0 
val2 0 
val3 1 
reg  97654 
val1 1 
reg  567834 
val3 1 
reg  567845 
val2 0 
val4 1 

Mein Ziel ist es, Daten in diesem Format in

reg  val1 val2 val3 val4 
12345 1  0  0  0 
45678 0  0  1  0 
97654 1  0  0  0 
567834 0  0  1  0 
567845 0  0  0  1 

der Hoffnung, jemanden zu verwandeln kann mich hier führen. Meine Datenquelle ist weniger als 200 Zeilen und es gibt keine Einschränkungen in Bezug auf den Ansatz. Bitte gehen Sie davon aus, dass die Maschine über ausreichend Speicher und Prozessorleistung verfügt.

+0

Sie müssen den Datenrahmen von einem langen Format in ein Breitformat-Transformation . Mehrere Ansätze mit tidyr sowie Datentabelle finden Sie hier https://stackoverflow.com/questions/30592094/r-spreaming-multiple-columns-with-tidyr – Niko

+0

Mögliche Duplikat von [Wie kann ich wiederholte Messungen von mehreren Variablen zu verbreiten in das breite Format?] (https://stackoverflow.com/questions/29775461/how-can-i-spread-repeated-measures-of-multiple-variables-into-wide-format) – Niko

+0

Vielleicht [dies] (https: //stackoverflow.com/a/44796994/2204410) kann eine Inspiration sein. – Jaap

Antwort

0

Auch wenn dies ein Duplikat ist, ich habe folgende Antwort nicht, so ... mit den Originaldaten starten:

df <- data.frame(A = c("reg","val1","val2","reg","val1","val2","val3","reg","val1","reg","val3","reg","val2","val4"), 
        B = c(12345, 1, 0, 45678, 0, 0, 1, 97654, 1, 567834, 1, 567845, 0, 1)) 

Ich benutze tidyverse Verben und einen Trick Etikett hinzuzufügen (in dummy) zu jeder Gruppe unter Verwendung "reg"cumsum:

install.packages("tidyverse") 
library(tidyverse) 
df1 <- df %>% 
      mutate(dummy = cumsum(A=="reg")) %>% 
      group_by(dummy) %>% 
      nest() %>% 
      mutate(data = map(data, ~spread(.x, A, B))) %>% 
      unnest() %>% 
      select(-dummy) 

Dies führt zu:

 reg val1 val2 val3 val4 
1 12345  1  0 NA NA 
2 45678  0  0  1 NA 
3 97654  1 NA NA NA 
4 567834 NA NA  1 NA 
5 567845 NA  0 NA  1 

Ich ziehe den NAs zu halten, aber wenn Sie dies nicht tun:

df1[is.na(df1)] <- 0 

    reg val1 val2 val3 val4 
1 12345  1  0  0  0 
2 45678  0  0  1  0 
3 97654  1  0  0  0 
4 567834  0  0  1  0 
5 567845  0  0  0  1 
+0

Ihre Lösung hat für mich funktioniert. – Acinonyx

0

Hier ist eine Option dcast

library(data.table) 
dcast(setDT(df), cumsum(A=="reg") ~ A, value.var = "B", fill = 0)[, A := NULL][] 
#  reg val1 val2 val3 val4 
#1: 12345 1 0 0 0 
#2: 45678 0 0 1 0 
#3: 97654 1 0 0 0 
#4: 567834 0 0 1 0 
#5: 567845 0 0 0 1 
+1

Ihre Lösung hat auch für mich funktioniert. – Acinonyx

Verwandte Themen