2016-08-09 3 views
0

ich einen Datenrahmen haben, die wie folgt aussieht:umformen meine Datenrahmen und das Hinzufügen einer Flagge

df <- 
ID TIME IPREDP IPREDM 
1  0.5 10  5 
1  1.0 15  7 
2  0.7 8   2 

ich meine Daten neu zu gestalten wollen und kollabieren die IPREDP und IPREDM Spalten in eine Spalte namens IPRED und eine Fahne hinzufügen genannt DVID für jeden und loswerden der ursprünglichen IPREDP und IPREDM Spalten. Also sollte die Ausgabe so sein:

dfout <- 
ID TIME DVID IPRED 
1  0.5  1  10 
1  0.5  2  5 
1  1.0  1  15 
1  1.0  2  7 
2  0.7  1  8 
2  0.7  2  2 

Wie kann ich dies in R auf dem schnellsten Weg erreichen?

+0

Mit tidyr und dplyr, 'df%>% sammeln (DVID, IPRED, IPREDP: IPREDM)%>% mutieren (DVID = als .integer (Faktor (DVID, Ebenen = c ('IPREDP', 'IPREDM')))) – alistaire

+0

mit Bibliothek (Umformen2), 'schmelzen (df, measure.vars = c (" IPREDP "," IPREDM "), value.name = "IPRED") ' – dww

+0

In der Basis R -' reshape (df, idvar = c ("ID", "ZEIT"), direction = "long", variierend = 3: 4, v.names = "IPRED ", Zeitvar =" DVID ")' – thelatemail

Antwort

2
library(reshape2) 
dfout <- melt(df,measure=c("IPREDP","IPREDM"), value="IPRED", variable="DVID") 
dfout$DVID <- as.integer(dfout$DVID) 
1

Wir verwenden melt von data.table

library(data.table) 
melt(setDT(df), id.var = c("ID", "TIME"), value.name = "IPRED")[ 
      order(ID)][, DVID := 1:.N,.(ID, variable)][] 
2
library("data.table") 
    df1 <- melt(df, id = c("ID", "TIME"), measure = c("IPREDP", "IPREDM"), value.name = "IPRED") 
    df1$DVID <- as.integer(df1$variable) 
    df1[, variable := NULL]