2017-12-21 7 views
0

(mehrere Spalten) ich zur Zeit breite Daten, die in etwa so aussehen:Daten von weiten zu langen Konvertieren

cid dyad f1 f2 op1 op2 ed1 ed2 junk 
1 2 0 0 2 4 5 7 0.876 
1 5 0 1 2 4 4 3 0.765 

etc

Und ich wünsche in einen langen Datenrahmen, die in etwa so aussieht :

cid dyad f op ed junk id 
1 2 0 2 5 0.876 1 
1 2 0 4 7 0.876 2 
1 5 0 2 4 0.765 1 
1 5 1 4 3 0.765 2 

ich versucht habe, mit der auch die reshape() function() Funktion sammeln, aber nicht herausfinden können, wie mehrere Spalten zu erstellen, anstatt alle Spalten in einer langen s einsturz tyle

All Hilfe

+2

wäre ein Hinweis 'melt' sein von' data.table' – akrun

+4

ich _think_ dies hier die kanonische Antwort sein: [mehrere Sätze von Messsäulen (Wide-Format) in einzelne Spalten (Langformat) umformen] (https://stackoverflow.com/questions/12466493/reshaping-multiple-sets-of-measurement-columns-wide-format-into-single-columns) – Henrik

+0

@akrun hwo verwenden Sie die Funktion melt() in diesem Fall? –

Antwort

2

Sie die Basis reshape() Funktion (grob) können gleichzeitig schmelzen über Mehrere Sätze von Variablen, unter Verwendung des varying Parameters und Einstellung direction bis "long".

Zum Beispiel hier, Sie liefern eine Liste von drei "Sätze" (Vektoren) von Variablennamen in die varying Argument:

dat <- read.table(text=" 
cid dyad f1 f2 op1 op2 ed1 ed2 junk 
1 2 0 0 2 4 5 7 0.876 
1 5 0 1 2 4 4 3 0.765 
", header=TRUE) 

reshape(dat, direction="long", 
     varying=list(c("f1","f2"), c("op1","op2"), c("ed1","ed2")), 
     v.names=c("f","op","ed")) 

Sie mit diesem Ende folgendes haben:

cid dyad junk time f op ed id 
1.1 1 2 0.876 1 0 2 5 1 
2.1 1 5 0.765 1 0 2 4 2 
1.2 1 2 0.876 2 0 4 7 1 
2.2 1 5 0.765 2 1 4 3 2 

Beachten Sie, dass zwei Variablen erstellt werden, zusätzlich zu den drei zusammengeklappten Mengen: eine $id Variable - die die Zeilennummer in der ursprünglichen Tabelle verfolgt (dat), und eine $time Variable - die th entspricht Die Reihenfolge der ursprünglichen Variablen, die zusammengebrochen wurden. Es gibt jetzt auch verschachtelte Zeilennummern - 1.1, 2.1, 1.2, 2.2, die hier nur die Werte von $id und $time in dieser Zeile sind.

Ohne genau zu wissen, was Sie versuchen zu verfolgen, schwer zu sagen, ob $id oder $time ist, was Sie als Zeilenbezeichner verwenden möchten, aber sie sind beide da.

könnte auch nützlich sein, mit den Parametern zu spielen timevar und idvar (Sie timevar zu NULL zum Beispiel festlegen können).

reshape(dat, direction="long", 
     varying=list(c("f1","f2"), c("op1","op2"), c("ed1","ed2")), 
     v.names=c("f","op","ed"), 
     timevar="id1", idvar="id2") 
0

Das tidyr Paket geschätzt wird dieses Problem löst, kann die Funktion sammelt mit, zu trennen und verbreiten:

df<-read.table(header=TRUE, text="cid dyad f1 f2 op1 op2 ed1 ed2 junk 
1 2 0 0 2 4 5 7 0.876 
       1 5 0 1 2 4 4 3 0.765") 

library(tidyr) 

print(df %>%gather(name, value, -c(cid, dyad, junk)) %>% 
    separate(name, into=c("name", "id"), sep= -2) %>% 
    spread(key=c(name), value) 
) 


#step by step: 
    #collect the columns f, op, ed to the common cid, dyad and junk 
df<-gather(df, name, value, -c(cid, dyad, junk)) 
    #separate the number id from the names 
df<-separate(df, name, into=c("name", "id"), sep= -2) 
    #made wide again. 
df<-spread(df, key=c(name), value) 
Verwandte Themen