2016-05-12 17 views
0

My-Datensatz sieht wie folgt aus:Transponieren von Datensatz

A B C B E 
1 144 119 120 52 
2 102 44 97 40 
3 128 81 88 39 

Jetzt habe ich den Datensatz in folgendem Format umsetzen wollen:

A Vars Values 
1 B  43 
2 B  78 
3 B  110 
1 C  46 
2 C  49 
3 C  130 
1 B  39 
2 B  86 
3 B  143 
1 E  59 
2 E  134 
3 E  49 

Aber wenn ich mit dem folgenden Code, einer der Die doppelte Variable kommt nicht in das Dataset.

Ich kann die doppelte Variable "B" vor dem Transponieren nicht umbenennen, da die Position von B dynamisch ist. Z.B. Es könnte 2 oder 3 oder mehr Variablen vor "B" geben. Also, jedes Mal, wenn man den Ort von "B" findet, ist das Umbenennen und anschließende Transponieren etwas hektisch.

Kann mir bitte jemand helfen, das Problem zu lösen?

Vielen Dank!

+0

@jogo: Nicht genau. Mein Problem ist nicht die Übertragung der Daten. Es wird perfekt umgesetzt. Das Problem ist, während die Transponierung von 1 der Variablen entfernt wird, weil sie den gleichen Namen haben. – Beta

+1

'cbind (df $ A, rep (Namen (df) [- 1], jeder = nrow (df)), c (als.matrix (df [-1])))' – jogo

+0

Vielen Dank jogo! Dies funktionierte für mich vollkommen in Ordnung. Könnten Sie bitte den Kommentar in den Antwortbereich schreiben? Dann kann ich es als richtige Antwort markieren. – Beta

Antwort

1

Das ist nicht schön, aber es funktioniert:

data.frame(A=df$A, Vars=rep(names(df)[-1], each=nrow(df)), Values=c(as.matrix(df[-1]))) 

oder:

data.frame(A=df$A, Vars=rep(names(df)[-1], each=nrow(df)), Values=stack(df[-1])[[1]]) 

verwendet Daten:

df <- read.table(header=TRUE, check.names=FALSE, text= 
"A B C B E 
1 144 119 120 52 
2 102 44 97 40 
3 128 81 88 39") 
3

Wie wäre es so etwas wie,

data.frame(df1$A, stack(df1[,-1])) 
# df1.A values ind 
#1  1 144 B 
#2  2 102 B 
#3  3 128 B 
#4  1 119 C 
#5  2  44 C 
#6  3  81 C 
#7  1 120 B.1 
#8  2  97 B.1 
#9  3  88 B.1 
#10  1  52 E 
#11  2  40 E 
#12  3  39 E 
+1

Vielen Dank Sotos! Aber ich habe Jogos Antwort bereits als richtig markiert. Auch wenn deine Antwort meine Frage perfekt erfüllt. – Beta

+0

Das ist in Ordnung @Beta :) – Sotos

+0

Es scheint, dass der OP nicht will B und B.1 in der Ausgabe zu unterscheiden. Also würde ich Ihre Codezeile wie folgt ändern: 'data.frame (df $ A, stack (as.list (df) [- 1])) ' – agenis